代码随想录算法训练营第一天| 数组理论基础:704. 二分查找,27. 移除元素

704 二分查找

题目链接

https://leetcode.cn/problems/binary-search/

看完题后的思路

二刷,温故而知新

思路

二分查找算法中的一个难点是收缩搜索区间过程中对left和right的赋值,到底right是等于 mid,还是mid-1,left到底是等于mid,还是mid+1.将区间的端点的开闭定义好,保持循环中不变,在循环中我们遵循事先的定义,对left,right的定义就不会乱了。

  另一个难点是while的终止问题,同样根据不变量原则,括号里写上满足条件的情况.当[]时,left>right时代表没有元素,所以left<=right为循环条件.[)时,right==left时代表没有元素,所以终止条件为left<right

代码

	  public int search(int[] nums, int target) {
        int left=0,right=nums.length;  // [)
        while (left<right){
            int mid=left+((right-left)>>2);
            if (nums[mid]==target){
                return mid;
            }else if (nums[mid]<target){
                left=mid+1;
            }else {
                right=mid;
            }
        }
        return -1;
    }

时间复杂度

0(logn)

实现过程中遇到的困难

27 移除元素

https://leetcode.cn/problems/remove-element/

看完题后的思路

二刷,温故而知新

思路

本题如果使用暴力算法,时间复杂度为0(n^2).可以使用双指针法,双指针法的关键是写代码前对指针所代表的意义搞清楚,这样在写代码的时候就不会乱了. 例如本题, 1代表有效数组末尾的下一个元素 curr代表当前要检查的元素.

代码

    public int removeElement(int[] nums, int val) {
        int l=0,curr=0; // 1 有效数组末尾的下一个元素 curr:当前要检查的元素
        while (curr<nums.length){
            if (nums[curr]==val){
                curr++;
            }else {
                nums[l++]=nums[curr++];
            }
        }
        return l;
}

时间复杂度

0(logn)

实现过程中遇到的困难

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈师亦友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值