代码随想录day1|704.二分查找 27.移除元素 35.插入搜索位置

704.二分查找

  • 题目链接:[https://leetcode.cn/problems/binary-search/]
    文章链接:[https://programmercarl.com/0704.二分查找.html#思路]
  • 第一思路:二分法原理很简单,跟小学时候求根号2的值是一样的,不断夹逼,通过比较中值与目标值的大小来改变边界。
    因为不知道循环的次数,所以使用while来做循环,再分别考虑大于小于等于三种情况。为了保持两边一致,用左闭右闭来写,保证初始边界,循环条件与循环体情况一致即可。
点击查看代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        while(left<=right){
            int middle=(right+left)/2;
            if(nums[middle]>target){
                right=middle-1;
            }
            else if(nums[middle]<target){
                left=middle+1;
            }
            else{
                return middle;
            }
        }
        return -1;

    }
};
  • 实现问题:第一次写时不太清除,循环条件没写一致。
  • 读后想法:1.本题的重点在于保证初始边界,循环条件和循环体的一致。
    2.没有注意到细节问题。int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
    在这个题中其实两种写法都可以,因为题中给定了n的范围[1, 10000],int的最大值为2147483647,远远超出了n的范围,left + right的最大值小于20000,不可能越界。

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

        }
        return slow;
    }
};
  • 实现问题:我居然返回值写成了return val,改了老半天没找到,最后发现感觉自己是个傻子。slow一直指向不重复数组的后一位(或者理解成计数器也可以),所以返回slow即可。
  • 读后想法:细心细心再细心

35.插入搜索位置

  • 题目链接[https://leetcode.cn/problems/search-insert-position/]
  • 第一思路:一看到时间复杂度要求为logn时,就想到要用二分法。当目标值存在于数组中的时候,和二分查找没有区别。因此本题的难点在于当目标值不在数组中时插入的位置。我的想法是通过中值middle与目标值target比较大小进行判断,最后写出了结果。但是我的思考过程是错误的,只是思考了目标值位于数组中的情况,没有考虑到位于数组前端和末尾的情况,碰巧作对。
点击查看代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        int middle=left+(right-left)/2;
        while(left<=right){
            middle=left+(right-left)/2;            
            if(nums[middle]<target){
                left=middle+1;
               
            }
            else if(nums[middle]>target){
                 right=middle-1;
            }
            else{
                return middle;
            }
        }
        if(nums[middle]>target){return middle;}
        else{return middle+1;}//通过middle来判断
        return middle;
    }
};
  • 实现问题:无
  • 读后想法:遇到这种情况不要慌,要把情况进行分析,分别考虑几种情况,最后综合起来写代码,很快就能解决。如果只在脑子里乱想,是不会得出结果的。
posted @   缩地  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示