跳至主要內容

双指针

holic-x...大约 2 分钟算法算法

难度说明:🟢简单🟡中等🔴困难

双指针

🟢01-移动零(283)

1.题目内容

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

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

2.题解思路

  • 如果是最简单的做法是循环遍历数组,然后判断非0数依次插入新数组,统计0的个数,然后数组尾部补齐0
  • 类似的,如果不引入新的数组则循环遍历、覆盖、补0即可

👻方法1(✅):

​ 已知移动的是0,此处采用覆盖、补0的思路,定义一个current指针,用于记录当前覆盖的位置,遍历数组过程中如果非0则进行覆盖、指针后移,最后一步再从当前覆盖位置开始到数组长度位置进行补0

public class Solution283 {
    public void moveZeroes(int[] nums) {
        // 循环遍历,依次进行覆盖(指针记录当前覆盖的位置,指针后面的用0补齐)
        int current = 0;
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]!=0){
                // 非0,覆盖
                nums[current] = nums[i];
                // 当前覆盖位置后移
                current++;
            }
        }
        // 从当前指针位置补0
        for(int i=current;i<nums.length;i++){
            nums[i]=0;
        }
    }
}

复杂度分析

  • 时间复杂度:
  • 空间复杂度:

思路2:双指针

​ 官方推荐的是双指针 + 交换思路

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }

    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

3.复盘

🟡02-盛最多水的容器(11)

1.题目内容

2.题解思路

3.复盘

🟡03-三数之和(15)

1.题目内容

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水

返回容器可以储存的最大水量。

**说明:**不能倾斜容器

2.题解思路

3.复盘

🔴04-接雨水(42)

1.题目内容

2.题解思路

3.复盘

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3