今晚美团第一题O(N)

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <limits.h>
using namespace std;

int main()
{
	int n, k;
	cin >> n;
	vector<int> v(n);
	for (auto i = 0; i != n; ++i)
		cin >> v[i];
	cin >> k;
	unordered_map<int, int> dict;
	dict.insert(make_pair(0, -1));
	int sum = 0;
	int res = INT_MIN;
	for (auto i = 0; i != n; ++i)
	{
		sum += v[i];
		if (dict.find(sum) == dict.end()) dict.insert(make_pair(sum%k, i));
		int temp = sum%k;
		if (dict.find(temp) != dict.end())
			res = max(res, i - dict[temp]);
	}
	cout << res << endl;
	return 0;
}


全部评论
我和楼主的思路一样,嘿嘿
点赞
送花
回复 分享
发布于 2017-08-31 22:14
leetcode 523
点赞
送花
回复 分享
发布于 2017-08-31 21:32
秋招专场
校招火热招聘中
官网直投
错了错了。。不是o(n) map的find也要复杂度的
点赞
送花
回复 分享
发布于 2017-08-31 22:05
用dp[i]记录以第i个元素作为序列的开始。遍历一遍原始序列nums,对于第K个值,将大于maxLen的序列dp[i]+nums[k],判断是否为K的倍数,更新maxLen的值。 public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); int[] nums = new int[n]; for (int i = 0; i < n; i++) nums[i] = in.nextInt(); in.nextLine(); int k = Integer.valueOf(in.nextLine()); int maxLen = 0; int[] dp = new int[n]; for (int i = 0; i < n; i++) { for (int j = 0; j <= i - maxLen; j++) { dp[j] += nums[i]; if (dp[j] % k == 0 && (i - j + 1) > maxLen) { maxLen = (i - j) + 1; break; } } } System.out.println(maxLen); in.close(); }
点赞
送花
回复 分享
发布于 2017-08-31 22:13
看不明白。大佬可以解释下吗?
点赞
送花
回复 分享
发布于 2017-08-31 22:15

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务