算法Day1-二分查找和移除数据

算法学习Day1-二分查找和移除数据(代码随想录)

二分查找:

今日学习的文章:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80

https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#_704-%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE

题目:LeetCode704

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVMHD7CS-1676472268210)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215223156411.png)]

​ 看到该题目,题目写的很明显是二分查找,也是想了一下就写出来代码,但是运行完发现错误,然后调试了一下,改了一下代码就成功了。

​ 但是在看了代码随想录之后发现了一个问题,其中提到了左闭右闭和左闭右开两种思路,而我对此一无所知,在看完文章之后,我依旧思路不太清晰,更加混乱了,又去看了代码随想录的相关的二分查找的视频:https://www.bilibili.com/video/BV1fA4y1o715

看完视频后思路清晰了一些,最后通过总结,更加清晰了一些,但是在我写完题目之后,发现不必去纠结这些,我就当成只有一种,将另一种做个了解,只把左闭右闭当作自己主要运用的方法即可。

本人思路如下所示:

class Solution {
    public int search(int[] nums, int target) {
        int high=nums.length;
        int low=0;
        int temp=0;
        while (nums[temp]!=target){
            temp=(low+high)/2;
            if(nums[temp]>target){
                high=temp;
            }
            else if(nums[temp]<target){
                low=temp+1;
            }
            if((high-low)<1){return -1;}
        }
        return temp;
    }
}

移除元素

学习的文章:

https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E6%80%9D%E8%B7%AF

题目:LeetCode 27

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64UhRGvo-1676472268211)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215205249066.png)]

​ 看到该题目,第一想法就是创建两个指针,然后边交换数据边往中间移动,知道两个指针相遇,想法比较地简单,感觉也可行

​ 在看完代码随想录之后,看到有一个暴力算法,不是特别感兴趣,而是有一个快慢指针的方法挺有意思,这也是一种思路,在我一开始写双向指针遇到挫折的时候这中算法也许更有效率

是将在数组头部就创建两个指针,然后一步步像后移动的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cf9ZIt2-1676472268212)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215214442476.png)]

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow=0,fast=0;
        int t=0;
        if(nums.length==0)return 0;
        for(;fast<nums.length;fast++){
            if(nums[fast]!=val){
                nums[slow]=nums[fast];
                slow++;
                continue;
            }
        }
        return slow;
    }
}

但是更为有效率的做法还是下列的双头的指针的做法

class Remove {
    public int removeElement(int[] nums,int val){

        int x=0,y=nums.length;
        if(nums.length==0)return 0;
        for(;x<y;){
            if(nums[x]==val){
                nums[x]=nums[y-1];
                y--;
                continue;
            }
            x++;
        }
        return y;
    }
}

​ 这两种方法我在实现的时候都碰到了一定的困难,虽然在实现过后看起来是很简单的,但是在实现的时候主要是在碰到只有一两个数的数组时碰到了困难,是在运用循环的时候对for、do…while循环的时候不是特别熟悉,特别是for循环条件中的最后一个分号条件的选择,是放在代码中还是放在括号中所呈现的效果是不一样的。

学习总结

组时碰到了困难,是在运用循环的时候对for、do…while循环的时候不是特别熟悉,特别是for循环条件中的最后一个分号条件的选择,是放在代码中还是放在括号中所呈现的效果是不一样的。

学习总结

​ 通过今天的算法学习,主要是开始找到做题的感觉,这是一个挺好的开始,今天的内容中,移除元素的内容掌握的比较好,个人倒是觉得二分法的细节处理解不是很到位,需要做做别的练习题再巩固一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值