代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方

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;
    }
};

左右指针都向中间移动,较大的放入数组末端直到两指针相遇。

posted @ 2024-08-01 14:22  kurumaruq  阅读(84)  评论(0)    收藏  举报