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

704.二分查找

对于有序元素的查找,二分搜索简单高效。

二分查找写很多遍了,三个指针:left right mid,重点在于范围的开闭情况。

我之前“背”的一直都是左闭右闭的情况

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        int mid;
        while(left<=right){
            mid=(left+right)/2;

            if(nums[mid]==target) return mid;
            if(nums[mid]>target){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return -1;
        
    }
};

如果要是左闭右开 [left,right),则

while(left<right)

right=mid

left=mid+1

  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

27.移除元素

自己先写了一下:思路是头尾两个指针遍历数组,如果头指针碰到要移除的元素则跟尾部指针所指的元素交换;如果尾指针指向的直接就是要移除元素,则它前移,计数加一。这个思路理论上是没问题的,但我写的时候没有处理好边界情况,例如只有一个元素并且它刚好要移除,所以通过不了。

学习双指针的思路写正确代码:

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];
            }
       }
       return slow;

    }
};

nums[slow++]=nums[fast];

nums[slow]=nums[fast];

slow++;

一样 之后都这样写显得简洁一点。

977.有序数组的平方

我的想法:

非负数平方前后的相对位置是不会变的,重点就是要把原来的负数平方后插入到正数当中去?卡住了

噢,看到函数返回值是数组,不是原地排序,那就简单了,双指针

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left=0,right=nums.size()-1;
        vector<int> res(nums.size());
        int index=nums.size()-1;
        
        while(left<=right){
            int sql=nums[left]*nums[left];
            int sqr=nums[right]*nums[right];
            if(sql>sqr){
                res[index--]=sql;
                left++;
            }else{
                res[index--]=sqr;
                right--;
            }
        }
        return res;
    }

};

while(left<=right)这里一开始写成了while(left<right),这样会导致有一个元素没有处理,res少了一个元素。

posted @ 2025-03-12 17:00  ChloeChen0221  阅读(95)  评论(0)    收藏  举报