代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

第一天,说一下对于我这个找资料文盲以及只会听别人指挥,自己没有啥思路规划的崽来说,报个卡哥的班还挺有效,说实在没有任务以及监督,在算法这一块,我可能很垃圾。。。
卡哥把题目链接以及各种参考链接都搞得很好。
而且就算我自学可能也不能很好的认识到什么,卡哥那个上面的方法指导,以及任务安排上的说明很详细。

题目都是力扣上的题

二分查找


力扣题目704 二分查找
思路:
二分查找我是这么理解的
前后两个指针,中间一个mid指针,通过不断二分,不断缩小区间来最终找到自己要找的元素
之前学过点y总的思路,我直接按照y总的思路教的,刚开始啥都忘了,然后自己一点点的回忆,从啥是二分法,主要特征,然后就是关键的那个地方。
我就记了一种,复杂的我也不会

就是如果num[mid]>=target,那么就让右边的指针往往左,即r=mid,
否则左边指针往右,
最终当l=r时跳出循环,并检验是否找到了要找的值

class Solution {
public:
    int search(vector<int>& nums, int target) {
            int l=0,r=nums.size()-1;
            while(l<r){
                int mid=l+r>>1;
                if(nums[mid]>=target)r=mid;
                    else l=mid+1;
            }
            if(nums[l]!=target)return -1;
            else return l;
    }
};

二分法的另一种情况就是mid=l+r+1>>1

  if(nums[mid]<=target))l=mid;
        else r=mid-1;

这两种模板的选择就是取决于你要找的数左边是都小于等于target,还是你要找的数右边都是大于target,
看你是从哪边开始想这个问题的,比如这个升序数组里有两个target,那么你一开始按照,这个target的右边的元素都比这个元素>=,那么你就能最终找到第一个target的位置,然后第二个就是从第一个target的位置开始往左找,所以你就得从此时的位置往右,那么你要找的target肯定比你左边的元素都大,此时用从左边找的模板nums[mid]<=target
如果你想都用从右边找,那么你寻找第二次的元素的l得+1,不能接着从已经找到的target 的位置再找了,否则还是找的第一个target。

二分查找的模板的应用 acwing789. 数的范围

移除元素


题目 27. 移除元素

自己写的解法
思路就是从头遍历数组,统计val的元素个数,顺便给不是val的元素往前移,与暴力的区别就是,不需要非得遇到一个val就非得把后面的元素都移动,万一移动的里面有val怎么办,
**只需对每个当前元素进行判断或移动即可。**最后返回数组元素数量,因为我毕竟有个count来计数

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //暴力
        int count =0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==val)count++;
            else nums[i-count]=nums[i];
        }return nums.size()-count;
    }
};

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_第1张图片

卡哥教的双指针:

思路参考链接

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
我之前的思路和快慢指针也差不多少

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置

通俗的说慢指针就是用来管经过修改的新数组,而快指针就是用来在原有数组上遍历寻找不是val的元素来加入新数组。
一个用来管新新数组,另一个用来遍历原数组

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //暴力
        int j=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]!=val)
            nums[j++]=nums[i];
        }return j;
    }
};

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_第2张图片

你可能感兴趣的:(代码随想录,算法,leetcode,acwing)