代码算法训练营day1 | 704二分查找、27移除元素

4 篇文章 0 订阅
本文详细介绍了LeetCode中的两道题目:704二分查找算法和27移除元素问题。作者强调了二分查找的关键在于数组有序,以及左闭右闭和左闭右开两种实现方式的区别。对于移除元素问题,通过双指针法在原数组上进行覆盖操作,展示了清晰的逻辑关系。
摘要由CSDN通过智能技术生成

leetcode 704 二分查找

题目链接
状态:做出来了
文档:programmercarl.com

思路: 关键是有序,用二分查找比大小即可。
实现过程:
选择了左闭右闭的规则,所以在while循环中可以设置条件 low <= high
但是运行代码报错,原因是:

 int mid = (low+high)/2;
 这段代码写在了while循环的外面,这是不行的
 因为在循环里也要不断更新low和high的值,随之mid的值也要进行改变,
 所以这段代码要放到while循环中才可以

代码:(两种写法:左闭右闭 和 左闭右开)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //左闭右闭
        int low = 0,high = nums.size()-1;
        
        while(low <= high) //high可以取到值,所以<=
        {
            //mid一定要放到while循环中,因为要不断更新mid
            int mid = (low+high)/2;
            //中间值<目标值,说明中间值小了,所以往右找 更新low
            if(nums[mid] < target) low = mid+1;
            //中间值>目标值,说明中间值大了,所以往左找 更新high
            else if(nums[mid] > target) high = mid-1;
            //目标值=中间值
            else return mid;
        }
        //没找到,return -1
        return -1;
    }
};
class Solution {
public:
    int search(vector<int>& nums, int target) {
        //左闭右开 [ )
        int low = 0,high = nums.size();
        
        while(low < high) //high不可以取到值,所以<
        {
            //mid一定要放到while循环中,因为要不断更新mid
            int mid = (low+high)/2;
            //中间值<目标值,说明中间值小了,所以往右找 更新low
            if(nums[mid] < target) low = mid+1;
            //中间值>目标值,high取不到mid 所以比较的时候比较的是mid-1
            else if(nums[mid] > target) high = mid;
            //目标值=中间值
            else return mid;
        }
        //没找到,return -1
        return -1;
    }
};

收获: 这道题还是比较简单的,主要就是要分清楚遵循的规则是什么。

leetcode 27 移除元素

题目链接
状态:
文档:programmercarl.com

思路: 不能开辟新的空间,只能在原有数组上进行改动,这就涉及了覆盖的操作。要注意的是,数组中的地址是连续的,不能随意删除,只能进行覆盖。
看完文档后的思路:
双指针法,分别设定一个i 和一个j,i 表示新数组的下标,j 去遍历数组的每一个元素,查看是否和target相同。如果nums[j] == target的话,就往前移,i不动,覆盖之后 i 和 j 都往后移动。
那么也就是相当于,nums[j] != target时, 一直往前移,i也要随之进行++,如果相等,那么i不动,等待 j 匹配到不相等的值的时候再让 j 去给 i 赋值。
代码:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int j = 0; //j去遍历数组
        int i = 0; //i是新数组的下标
        
        while(j<nums.size())
        {
            //不等于的时候 进行赋值移动
            if(nums[j] != val)
            {
                nums[i] = nums[j];
                i++;
                j++;
            }
            else
            {
                //相等的时候 i不动,只让j继续遍历 直到匹配到不相等
                j++;
            } 
        }
        return i;
    }
    
};

收获: 使用双指针法是非常方便的,还是要整理好i和j的逻辑关系,理清楚谁先走 谁后走 谁怎么走的。i:赋值之后才走,不赋值不走。j:遍历,不管怎么样都要往后走,而且走的还会比 i 快。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值