代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方

704.二分查找

代码随想录链接:代码随想录 (programmercarl.com)

要点:数组有序且无重复元素

1. 左闭右闭:区间左右边界都有意义

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //左闭右闭
        int left=0;
        int right=nums.size()-1;
        while(left<=right){
            int mid=left+((right-left)/2);
            if(nums[mid]<target){
                left=mid+1;
            }
            else if(nums[mid]>target){
                right=mid-1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

2. 左闭右开:右边界无意义。需要注意right的赋值

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //左闭右开
        int left=0;
        int right=nums.size();
        while(left<right){
            int mid = left+((right-left)/2);
            if(nums[mid]>target){
                right=mid;
            }
            else if(nums[mid]<target){
                left=mid+1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

27.移除元素

1. 暴力

需要更新数组的大小;删掉元素后下标i需要向前一个,因为后面的数组都向前移了(代码随想录链接)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //暴力
        int count=nums.size();
        for(int i=0;i<count;i++){
            if(nums[i]==val){
                for(int j=i;j<count-1;j++){
                    nums[j]=nums[j+1];
                }
                i-=1;// 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                count-=1;
            }
        }
        return count;
    }
};

2. 双指针

快慢指针来做交换。

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

977.有序数组的平方

做完27就一直想两个同方向的指针比大小交换(后来想想这样好像就是暴力排序了),但是数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。(代码随想录链接)头尾指针比较。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int h=0;
        int t=nums.size()-1;
        int k=nums.size()-1;
        vector<int> result(nums.size(),0);
        while(h<=t){
            if(nums[h]*nums[h]<=nums[t]*nums[t]){
                result[k]=nums[t]*nums[t];
                t--;
            }
            else{
                result[k]=nums[h]*nums[h];
                h++;
            }
            k--;
        }
        return result;
    }
};

总结

复习了二分查找。移除元素的快慢指针写的时候逻辑出错了,debug用了一些时间。有序数组的平方没有想到头尾指针。

时间复杂度的计算对我来说一直是难题,上课的时候没学好真是后悔啊。后面一边做题一边训练,希望能好一点。

今天做题时间上用了快2个小时,中间总是玩手机或者看别的去了。希望通过这次训练营可以提升一些专注力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值