代码随想录刷题寒假篇

知识点 1 :数组理论基础

一维、二维数组内存空间是连续的,位置从0开始,所以删除元素是进行覆盖操作

知识点 2 :二分查找法 704

题型:给定一个有序的数组nums和目标值target,搜索nums中的target,如果存在返回target的下标,如果不存在返回-1.

前提:有序+无重复+搜索

易错:区间边界问题

总结: 左闭右开的写法中,关键是找到一个中间值与目标值进行大小比较

中间值<目标值 :更新左半区间的右边界  middle+1

中间值>目标值:更新右半区间的左边界   middle

知识点 3 :移除元素 27

题型:给定一个数组nums和一个值value ,原地移除所有等于value的值,返回新数组的长度

前提:O(1)

注意:数组是不可以直接删除的,是覆盖

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow=0;//定义慢指针
        for(int fast=0;fast<nums.size();fast++)
        {
            if(nums[fast]!=val)
            {
                nums[slow]=nums[fast];
                slow++;
            }    
        }
        return slow;
    }
};

总结:利用双指针的思路,定义快指针fast去寻找新数组的元素,慢指针slow去接收fast更新的值,如果遇到要删除的元素,fast仍然向前移动,但是slow要在原地等待,所以最终的slow就是新数组的长度

题目1 :删除有序数组中的重复项 26

题目2 :移动零  283

题目3 : 比较含退格的字符串 844

题目4 :有序数组的平方  977

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(),0); //定义一个新数组来装平方后的数据
        int j=nums.size()-1;
        int k=nums.size()-1;//k的下标
        for(int i=0,j=nums.size()-1;i<=j;) //注意写法逗号
        {
            if((nums[i]*nums[i]) < (nums[j]*nums[j]))  //右边是最大值  更新右边j
            {
                result[k]=nums[j]*nums[j];
                k--;
                j--;
            }
            else //左边是最大值 更新左边i 可以合并
            {
                result[k]=nums[i]*nums[i];
                k--;
                i++;
            }
        }
        return result;
    }
};

知识点 4 :长度最小的子数组 209

思想:滑动窗口

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {  //已经有target了
        int i=0;
        int j=0;
        int sum=0;//数组和 在更新
        int result=INT32_MAX;//因为数组未知,这是32位系统数组的最大长度 只有最大才能更新length
        int length=0;//滑动窗口的长度即要返回的数组长度
        for(j=0;j<nums.size();j++)
        {
            sum=sum+nums[j];//只要for循环一次,j后移一次加sum
            while(sum>=target)//只要子数组的元素和大于s 那么移动起始位置使得长度最短
            {
                length=j-i+1;//滑动窗口长度(终止-起始+1)数组下标从0开始
                //result=result < length ? result:length;//要使得数组长度最短那么就要比较
                result=min(result,length);
                sum=sum-nums[i];
                i++;
            }
        }
        return result==INT32_MAX?0:result;//如果result没有被赋值说明找不到子数组返回0,否则返回result

    }
};

题目1 水果成篮 904

题目2 最小覆盖子串 76

知识点5  螺旋矩阵  59

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值