** 704. 二分查找 **
leetcode鏈接:https://leetcode.cn/problems/binary-search/ 題目描述:給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
核心思路:二分法。當數組為有序數組時可以使用。時間複雜度:O(logn) 空間複雜度:O(1)

點擊查看代碼

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0,right = nums.size() - 1;
        while(left <= right){ //**mistake1:**"=",左閉右閉區間時,應包含=的情況。
            int mid = left + (right - left) / 2;
            if(target < nums[mid]){//**mistake2**:使用nums[mid]而不是mid,粗心
                right = mid - 1;
            }
            else if(target > nums[mid]){
                left = mid + 1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

另一種情況,當區間為左閉右開時,right取值為nums.size(),循環條件不在包含=的情況,當nums[mid]與target比較時,當nums[mid]>target時,right = nums[mid];

** 27. 移除元素**
leetcode鏈接:https://leetcode.cn/problems/remove-element/ 題目描述:給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後數組的新長度。
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間並原地修改輸入數組。
元素的順序可以改變。你不需要考慮數組中超出新長度後面的元素。
示例 1: 給定 nums = [3,2,2,3], val = 3, 函數應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。 你不需要考慮數組中超出新長度後面的元素。

示例 2: 給定 nums = [0,1,2,2,3,0,4,2], val = 2, 函數應該返回新的長度 5, 並且 nums 中的前五個元素為 0, 1, 3, 0, 4。
你不需要考慮數組中超出新長度後面的元素。

使用方法:暴力法或者雙指針法。
暴力法:雙循環嵌套,主要注意有效長度size,需理解size和i--的含義,原文並沒有講清楚這一點。

點擊查看代碼

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();//定義size為數組的有效範圍
        for(int i = 0;i < size;i++){
            if(nums[i] == val){
                for(int j = i + 1;j < size;j++){
                    nums[j-1] = nums[j];
                }
                i--;//當剔除元素時,i--後再++確保了在原地進行修改
                size--;//size--則是將有效範圍-1,相當於刪去了最後一位,因為最後一位的數值已複製到前一位,隨着循環進行,需要刪除的數一直往前賦值就可以實現在原地進行修改
            }
        }
        return size;
    }
};

雙指針法:雙指針的核心在於如何設計雙指針。

點擊查看代碼

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowly = 0;
        for(int fast = 0;fast<nums.size();fast++){
            if(nums[fast] != val){
                nums[slowly++] = nums[fast];//核心:當找到目標值時,slowly停止移動,而fast會繼續移動到下一位。如果下一位不等於目標值,此時slowly被覆蓋後向下繼續移動
            }
        }
        return slowly;
    }
};

**27. 移除元素** leetcode鏈接:https://www.bilibili.com/video/BV12A4y1Z7LP 題目描述:給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。 思路:雙指針法。同樣是如何設計雙指針,由於數組非遞減,考慮將雙指針指向數組兩端,指向的數開平方後進行比較,定義一個新數組result來存儲比較的結果。 首先使用暴力法,快速排序 點擊查看代碼

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i = 0;i < nums.size();i++){
            nums[i] *= nums[i];
        }
        sort(nums.begin(),nums.end());//快排
        return nums;
    }
};

雙指針法: 點擊查看代碼

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(),0);
        int k = nums.size() - 1;
        for(int i = 0, j = nums.size() - 1;i <= j;){//for( 初始化表達式 ; 條件判斷表達式 ; 遞增/遞減表達式 )
            if(nums[i]*nums[i] < nums[j]*nums[j]){
                result[k--] = nums[j]*nums[j];
                j--;
            }
            else{
                result[k--] = nums[i]*nums[i];
                i++;
            }
        }
        return result;
    }
};