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

1.704.二分查找

题目链接:​​​​​704. 二分查找 - 力扣(LeetCode)​​​​​​

(1):该情况是在左闭右闭的情况下。也就是[left,right]

C代码如下: 

int search(int* nums, int numsSize, int target){
       int left = 0;
       int right = numSize-1;
       int middle =0;
       while(left<=right){//证明区间的元素不为0
             middle = (left + right)/2;
        if(nums[middle] > target){//目标值可能在[left,miidle-1]
               right = middle-1;
}
         else if(nums[midddle]<target){//目标值可能在[middle+1,right]
                 left = middle+1;
}
          else if(nums[middle]==target){
                 return middle;
}

}
return -1;
}

 (2):该情况是在左闭右开,也就是[left,right)

C代码如下:

int search(int* nums, int numsSize, int target){
          int length = 0;
          int left = 0;
          int right =length;
          int middle = 0;
     while(left<right){//因为是左闭右开,所以防止出现left==right
            middle = left + (right - left)/2;

      if(nums[middle]<target){
              left = middle + 1;
}

     else if(nums[middle]>target){
              right = middle;
}
     else if(nums[middle]==target){
              retunr middle;
}

}
return -1;


}

 总结:

面对这种一组数想要查找其中数的位置,最容易也是最先能想到的就是二分查找,在二分查找中主要有两种情况,分别为:左闭右闭和左闭右开。但两者的方法是不同的,最主right的最后赋值,在左闭右闭中因为当前nums[middle]一定不是target,所以要赋值middle-1,在左闭右开中右区间是开,而此时要去左区间寻找,所以right此时要赋值middle。

27.移除元素 

题目链接: 27. 移除元素 - 力扣(LeetCode)

 

两种解法:暴力法,双指针法(精髓)

(1):暴力法:两层for循环,第一层遍历整个数组,之后遍历更新后的数组

(2):双指针法

C代码如下:

int removeElement(int* nums, int numsSize, int val){
    int slow = 0;
    for(int fast = 0; fast < numsSize; fast++) {
              if(nums[fast] != val) {
                    nums[slow++] = nums[fast];
                }
            }
                return slow;
       }

 总结:

暴力法不做过多解释,双指针可以极大简化代码,关于双指针就是有快指针和慢指针,当快指针所找的元素不等于所要求寻找的元素,就会将该元素向前覆盖一位。归结一句话:通过快指针和慢指针在一个for循环下可以完成两个for循环的工作。

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值