算法小知识-------01.31-------双指针(二)

188 阅读2分钟

这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

这一篇也是双指针,对于双指针的加深印象

两数之和 II ,输入有序数组

该题出自力扣的167题 —— 两数之和 II ,输入有序数组【简单题】

审题

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

  • 题意很简单,给定一个非递减的数组,和一个目标值,找出满足目标的两个下标
  • 很明朗,直接用双指针实现
    • 不存在漏掉的情况
    • 因为比目标值大则会右指针左移,比目标值小则会左指针右移

编码

    public int[] twoSum(int[] numbers, int target) {
        int[] a = new int[2];
        int n = numbers.length,left=0,right = n-1;
        while(right > left){
            int max = numbers[left] + numbers[right];
            if(max==target){
                a[0] = left +1;
                a[1] = right + 1;
                return a;
            }else if(max > target){
                right --;
            }else{
                left++;
            }
        }
        return null;
    }

image.png

移动零

该题出自力扣的283题 —— 移动0【简单题】

审题

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。

  • 题意也是相对简单,就是把数组的0移动到末尾,但是不改变数组内非0的相对顺序
  • 解决方法:
    • 方法一:移动0,利用双指针的方法,指针分别指向已改变的数组末尾和待改变的序列头
    • 方法二:直接覆盖数组的0,并在数组的末尾对剩余索引填充0;

编码

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

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

image.png