hot100----数组

72 阅读1分钟

最大子数组和(leetcode.53)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre = 0,maxAns = nums[0];
        for(const auto &x:nums){
            // [-2,1,-3,4,-1,2,1,-5,4]
            // pre就是尝试找出元素的最大和,新来一个元素x,如果加上后pre更大,则更新最大和
            // 如果加上后pre变小,分为两种情况:
            // 1.再继续往后遍历时pre变大,但未超过记录的最大和,那么就继续保留这段子数组
            // 2.再继续往后遍历时pre变大,且超过了记录的最大和,那么就把新的元素单独成为一段(重新成为起点)
            pre = max(pre+x,x);
            maxAns = max(maxAns,pre);
        }
        return maxAns;
    }
};

合并区间(leetcode.56)

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        vector<vector<int>> ans;
        //排序 保证数组升序
        //如果 a[0] < b[0],则 a 排在 b 前面。
        //如果 a[0] > b[0],则 a 排在 b 后面。
        //如果 a[0] == b[0],继续比较 a[1]b[1]。
        sort(intervals.begin(),intervals.end());
        for(int i = 0; i < n; i++){
            //判断是否越界 两个数组是否有重合部分
            if(i < n - 1 && intervals[i][1] >= intervals[i+1][0]){
                //更新原数组
                //例:[1,2][2,3][5,6] => [1,2][1,3][5,6]
                intervals[i+1][0] = min(intervals[i][0],intervals[i+1][0]);
                intervals[i+1][1] = max(intervals[i+1][1],intervals[i][1]);
            }
            //如果和下一个数组没有重合部分 则推入答案数组
            //注意 如果i == n - 1 代表数组末尾 一定推入答案数组
            else if(i == n - 1 || intervals[i][1] < intervals[i+1][0]){
                ans.push_back({intervals[i][0],intervals[i][1]});
            }
        }
        return ans;
    }
};

轮转数组(leetcode.189)

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> newArr(n);
        for(int i = 0;i < n; i++){
            newArr[(i+k)%n] = nums[i];
        }
        nums.assign(newArr.begin(),newArr.end());
    }
};