0627.算法-数组

1. 力扣704. 二分查找

2.27. 移除元素

两端双指针,左指针是要移除的元素就用右指针指向的元素代替,然后再判断一次左指针当前元素

    int removeElement(vector<int>& nums, int val) {
        if(nums.size() == 0)    return 0;
        int left = 0;
        int right = nums.size()-1;
        while(left <= right)
        {
            if(nums[left] == val)
                swap(nums[left--],nums[right--]);
            left++;
        }
        return left;
    }

977. 有序数组的平方

前后双指针,找大的放在结果数组的最后一个位置上

209. 长度最小的子数组

1.暴力解法:计算每个位置开始符合目标的数组长度,返回最小的

2.滑动窗口:暴力解法中要从每个位置开始计算子数组,用滑动窗口避免重复计算

for()循环控制窗口结束位置,用一个指针控制窗口开始的位置

窗口移动规则:窗口数组和>=target,收缩;每次for循环扩张

    int minSubArrayLen(int target, vector<int>& nums) {
        int begin = 0, end = 0;
        int ans = nums.size() + 1 ; //先初始化一个不可能的结果 用来判断是否返回0
        int sum = 0, length = 0;
        for(end; end < nums.size(); end++){
            sum += nums[end]; //窗口数组和 每次for循环end++扩张窗口
            length++;
            while(sum >= target){ //窗口数组和>=target  收缩窗口
                sum -= nums[begin];
                begin++;
                ans = min(length , ans); //如果当前子数组长度更小,更新结果
                length--;
            }          
        }
        return ans == nums.size()+1? 0:ans;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值