题目:

给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最有一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置。

样例:

给出[-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


wydong
40 声望5 粉丝

wyd


下一篇 »
爬楼梯