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

704 二分查找:

      • 二分查找法:

        • 难点:

          • 1,while循环 left< right 还是 left <= right
          • 2, right 是mid 还是 mid -1
        • 解题思路:

          • 【思考当l ==r 是否合法】
          • 1,先确定是[l,r],还是[l,r)
        • 具体步骤:

          • 【l,r】
            • 1,while(l <= r)
            • 2,right = mid -1
              • 因为right可能等于mid
          • [l,r)
            • 1,while(l < r)
            • 2,right = mid
              • 因为right不会等于mid
      •  
        核心代码:
 1 #include<iostream>
 2 #include "Array.h"
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 int binarySearch(vector<int>& nums, int target)
 8 {
 9     // [l,r]
10     int left = 0;
11     int right = nums.size() - 1;
12 
13     while(left <= right)
14     {    
15         int mid = (right - left) / 2 + left;//越界
16         if (nums[mid] == target)
17         {
18             return mid;
19         }
20         else if (nums[mid] < target)
21         {
22             left = mid + 1;// 为什么不是left = mid?
23         }
24         else if (nums[mid] > target)
25         {
26             //因为mid 可能等于 right,所以 mid不是target, right = mid -1;
27             right = mid - 1;
28         }
29     }
30 
31     return -1;
32 }

 

27: 移除元素

  1,难点:

    当修改for循环值得时候,一定要注意不要移除

  2,之前的错误:

#include<iostream>
#include "Array.h"
#include <vector>
using namespace std;


int removeElement(std::vector<int>& nums, int val)
{
    // 快慢指针
    // 快指针的值 -》 慢指针
    int  slow = 0;
    int fast = 0;

    for (fast = 0; fast < nums.size(); fast++)
    {
        // 这是个问题,当移动到要移除的结点的时候,就不要把值 ->数组了
        if (nums[fast] != val)
        {
            
            slow++;
        }
        nums[slow] = nums[fast];
    }

    return slow ;
}

以上代码会导致溢出,应该这样写:

 1 int removeElement(std::vector<int>& nums, int val)
 2 {
 3     // 快慢指针
 4     // 快指针的值 -》 慢指针
 5     int  slow = 0;
 6     int fast = 0;
 7 
 8     for (fast = 0; fast < nums.size(); fast++)
 9     {
10         // 这是个问题,当移动到要移除的结点的时候,就不要把值 ->数组了
11         if (nums[fast] != val)
12         {
13             nums[slow] = nums[fast];
14             slow++;
15         }
16         
17     }
18 
19     return slow ;
20 }

 

posted @ 2023-06-07 22:42  博二爷  阅读(205)  评论(0编辑  收藏  举报