题目:
给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最有一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置。
样例:
给出[-3, 1, 1, -3, 5],返回[0, 2],[1, 3], [1, 1], [2, 2] 或者 [0, 4]。
思路:
第一遍:遍历给定数组,将0-i元素的和sum以及i的下标存储到pair<int,int>结构中。
第二遍:遍历pair元素,按照sum排序,计算相邻sum的差值。(理由:sum的差值[绝对值]越小,表明之间的元素和越接近0)
假设[0-2]和[0-4]的sum值的差值最小,那么结果为index[3,4]。
参考答案:
class Solution {
public:
/*
* @param nums: A list of integers
* @return: A list of integers includes the index of the first number and the index of the last number
*/
vector<int> subarraySumClosest(vector<int> &nums) {
// write your code here
int n = nums.size();
vector<pair<int,int>> s(n); //储存0-index的和以及index值
vector<int> res(2); //储存结果下标
if(n==0 | n==1)
{
res[0] = 0;
res[1] = 0;
return res;
}
int sum = 0;
for(int i=0; i<n; i++){//存储0-index的和
sum += nums[i];
s[i].first = sum;
s[i].second = i;
}
sort(s.begin(), s.end());
n = s.size();
int ans = 999999;
for(int i=0; i<n-1; i++){
if(abs(s[i+1].first - s[i].first) < ans)
{
ans = abs(s[i+1].first - s[i].first);
res[0] = min(s[i+1].second, s[i].second) + 1; //注意,需要加1
res[1] = max(s[i+1].second, s[i].second);
}
}
return res;
}
};
时间复杂度:nlogn
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。