程式碼隨想錄演算法訓練營day01|704. 二分查詢,27. 移除元素,977.有序陣列的平方

kurumaruq發表於2024-08-01

704. 二分查詢

題目連結:https://leetcode.cn/problems/binary-search/description/

本人程式碼:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low=0,high=nums.size()-1;//此處分情況討論
        return searchTarget(nums,low,high,target);
    }
    int searchTarget(vector<int>& nums,int low,int high,int target){
        while(high>=low){//此處分情況討論
        int mid=(low+high)/2;//可作差除以二後加較小數防止溢位
        if(nums[mid]==target) {return mid;}
        if(nums[mid]>target) {high=mid-1;}//此處分情況討論
        if(nums[mid]<target) {low=mid+1;}//此處分情況討論
        }
        return -1;
    }
};

本題左閉右閉區間,另有左閉右開等情況,分情況討論。

27. 移除元素

題目連結:https://leetcode.cn/problems/remove-element/description/

本人程式碼(暴力解法):

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int k=0,n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[i]==val){
                for(int j=i;j<n-1;j++){
                    nums[j]=nums[j+1];
                }
                i--;
                n--;
            }else k++;
        }
        return k;
    }
};

將不含val的陣列元素依次向前移動形成新陣列

雙指標解法(快慢指標):

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

快指標:依次向後尋找不含val的新陣列元素
慢指標:記錄新陣列的下標

977.有序陣列的平方

題目連結:https://leetcode.cn/problems/squares-of-a-sorted-array/

本人程式碼(暴力解法):

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            nums[i]=nums[i]*nums[i];
        }
        for(int i=0;i<nums.size()-1;i++){
            for(int j=0;j<nums.size()-i-1;j++){
                if(nums[j]>nums[j+1]){
                    int temp=nums[j+1];
                    nums[j+1]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        return nums;
    }
};

先平方再氣泡排序

雙指標解法(左右指標):

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(),0);
        int i=0;
        int j=nums.size()-1;
        int k=nums.size()-1;
        while(i<=j){
            if(nums[i]*nums[i]>=nums[j]*nums[j]){
            result[k--]=nums[i]*nums[i];
            i++;
            }
            else{
            result[k--]=nums[j]*nums[j];
            j--;
            }
        }
        return result;
    }
};

左右指標都向中間移動,較大的放入陣列末端直到兩指標相遇

相關文章