双指针算法

一、Leetcode27.移除元素

1.题目描述

给你一个数组 nums和一个值 val,你需要 [原地] 移除所有数值等于 val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 [原地 ]修改输入数组
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

2.暴力破解
public int removeElement(int[] nums, int val) {
        int size = nums.length;
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) {
                for (int j = i + 1; j < nums.length; j++) {
                    nums[j - 1] = nums[j];
                }
                size--;
                i--;
            }
        }
        return size;
    }
  • size–: 当遇到了数组中和目标相等的元素,说明是要移除的,所以size–
  • i–: 因为在遇到了需要移除的元素之后,是用后面的元素覆盖了前面的元素,所以当进入了if判断之后,说明后面一个待比较的新的元素已经移动到前一位去了,所以i–,才可以再比较到这个移动到了前面的新的元素。
3.双指针
  public static int removeElementDoublePoint(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }

定义一个快指针fast,用来正常的遍历元素;
定义一个慢指针slow,用来指向新的数组的元素(删除了目标元素后的)
没有遇到目标元素时所指向的元素(符合的元素),都存入新数组(slow指向)

二、Leetcode977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
1.暴力破解

遍历数组的每一个元素,算出平方。再对结果进行排序

    public static int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        return insertSort(nums);
    }

    /**
     * 选择排序
     *
     * @param nums
     * @return
     */
    private static int[] selectSort(int[] nums) {
        for (int j = 0; j < nums.length; j++) {
            int minValueIndex = j;
            for (int k = j + 1; k < nums.length; k++) {
                // 找出索引最小的
                minValueIndex = nums[k] < nums[minValueIndex] ? k : minValueIndex;
            }
            //把找到的下标和第j个元素交换 nums[j] nums[minValueIndex]
            int temp = nums[j];
            nums[j] = nums[minValueIndex];
            nums[minValueIndex] = temp;
        }
        return nums;
    }

    /**
     * 插入排序
     *
     * @param nums
     * @return
     */
    private static int[] insertSort(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i; j > 0; j--) {
                if (nums[j] < nums[j - 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j - 1];
                    nums[j - 1] = temp;
                } else {
                    break;
                }
            }
        }
        return nums;
    }
2.双指针

头指针和尾指针,头指针从下标0开始,尾指针从最后一个元素(下标nums.length-1)开始,头指针前进,尾指针后退,直到相遇就是遍历完了;遍历的过程中,每次都取出更大的那个数,存入一个新的数组中,从最后一个下标往前存,因为是非递减的。

    public static int[] sortedSquares(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        int[] sortedSquareNums = new int[nums.length];
        int index = nums.length - 1;
        while (start <= end) {
            int startSquare = nums[start] * nums[start];
            int endSquare = nums[end] * nums[end];
            if (startSquare > endSquare) {
                sortedSquareNums[index] = startSquare;
                start++;
            } else {
                sortedSquareNums[index] = endSquare;
                end--;
            }
            index--;
        }
        return sortedSquareNums;
    }

前提是数组是非递减的,如果是乱序的,此方案行不通

相关推荐

  1. 指针算法———C++

    2024-05-04 14:30:01       45 阅读
  2. 指针算法笔记

    2024-05-04 14:30:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-04 14:30:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-04 14:30:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-04 14:30:01       87 阅读
  4. Python语言-面向对象

    2024-05-04 14:30:01       96 阅读

热门阅读

  1. AT_abc348_d [ABC348D] Medicines on Grid 题解

    2024-05-04 14:30:01       36 阅读
  2. PostgreSQL自带的命令行工具06- pg_isready

    2024-05-04 14:30:01       32 阅读
  3. u-boot引导加载程序的命令列表

    2024-05-04 14:30:01       34 阅读
  4. 边缘计算概述_2.边缘计算的特点

    2024-05-04 14:30:01       38 阅读
  5. 牛客Xorto

    2024-05-04 14:30:01       30 阅读
  6. 附录C:招聘流程

    2024-05-04 14:30:01       27 阅读
  7. 2011NOIP普及组真题 2. 统计单词数

    2024-05-04 14:30:01       34 阅读
  8. 江西省建设工程专业技术人员职称申报条件

    2024-05-04 14:30:01       34 阅读