目录

704. 二分查找

左闭右闭解法

左闭右开解法

27. 移除元素

暴力法

双指针法

977. 有序数组的平方

暴力法

双指针法


704. 二分查找

解决问题的关键在于搜索区间的定义。

左闭右闭解法

class Solution {
public:
    int search(vector<int>& nums, int target) {
        // 左闭右闭
        int left = 0;
        int right = nums.size() - 1;

        while (left <= right) {
            int middle = left + (right - left) / 2;
            if (nums[middle] > target)
                right = middle - 1;
            else if (nums[middle] < target)
                left = middle + 1;
            else
                return middle;
        }
        return -1;
    }
};

左闭右开解法

class Solution {
public:
    int search(vector<int>& nums, int target) {
        // 左闭右开
        int left = 0;
        int right = nums.size();

        while (left < right) {
            int middle = left + (right - left) / 2;
            if (nums[middle] > target)
                right = middle;
            else if (nums[middle] < target)
                left = middle + 1;
            else
                return middle;
        }
        return -1;
    }
};

27. 移除元素

题目链接:

暴力法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.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];
                }
                size--;
                i--;
            }
        }
        return size;
    }
};

双指针法

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

977. 有序数组的平方

题目链接:

暴力法

时间复杂度O(n + nlogn),遍历和快排。

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

        sort(nums.begin(), nums.end());
        return nums;
    }
};

双指针法

题目给出的数组是升序的。对其元素平方后,其数据要不就中间小两头大(有负数),要不就还是升序。采用初始时一个指向起始位置、一个指向终止位置的双指针进行比较遍历,并把大者逆序存在result中就是答案了。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k = nums.size() - 1;
        int i = 0; int j = k;
        vector<int> result(k + 1, 0);

        while(i <= j) {
            int iSquare = nums[i]*nums[i];
            int jSquare = nums[j]*nums[j];
            if (iSquare < jSquare){
                result[k--] = jSquare;
                j--;
            }
            else {
                result[k--] = iSquare;
                i++;
            }
        }
        return result;
    }
};

posted on 2026-01-14 16:05  快乐的乙炔  阅读(1)  评论(0)    收藏  举报  来源