【每日Leetcode】双指针系列(二)

文摘   职场   2024-07-01 13:53   上海  

【283. 移动零】

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/move-zeroes/description/

同向双指针。

class Solution {public:    void moveZeroes(vector<int>& nums) {        int l = 0, r = 0;        while (r < nums.size()) {            if (nums[r] != 0) {                swap(nums[l], nums[r]);                l++;            }            r++;        }    }};

【88. 合并两个有序数组】

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/merge-sorted-array/description/

合并nums2到nums1中。
class Solution {public:    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {        int p1 = m - 1;        int p2 = n - 1;        while (p1 >= 0 && p2 >= 0) {            if (nums1[p1] > nums2[p2]) {                nums1[p1 + p2 + 1] = nums1[p1];                --p1;            } else {                nums1[p1 + p2 + 1] = nums2[p2];                --p2;            }        }        while (p1 >= 0) {            nums1[p1 + p2 + 1] = nums1[p1];            --p1;        }        while (p2 >= 0) {            nums1[p1 + p2 + 1] = nums2[p2];            --p2;        }    }};


【240. 搜索二维矩阵 II】之双指针解法

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。

  • 每列的元素从上到下升序排列。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/description/

根据矩阵规律,从左下角开始,往右上角逼近,或者从右上角开始,往左下角逼近 O(M+N)。

class Solution {public:    bool searchMatrix(vector<vector<int>>& matrix, int target) {        int m = matrix.size();        int n = matrix[0].size();        int x = m - 1;        int y = 0;        while (x >= 0 && y < n) {            if (matrix[x][y] == target) return true;            if (matrix[x][y] < target) ++y;            else --x;        }        return false;    }};


相关链接:【每日Leetcode】双指针系列(一)

Arrietty刷题日记
清华计算机系学霸带你刷Leetcode(求职面试/保研考研/转计算机行业...)