• 【算法-双指针思想】


    双指针思想

    双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

    定义快慢指针
    快指针: 寻找新数组的元素 ,新数组就是不含有目标元素的数组
    慢指针: 指向更新 新数组下标的位置

    双指针法(快慢指针法)在数组链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
    自我思考:两个指针也不一定是一快一慢,也可能是从中间开始一左一右的双指针,也可以是开头结尾的双指针,根据题目灵活变通双指针的应用。

    1、移除元素 (经典双指针)

    题目:

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

    不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
    示例 1:给定 nums = [3,2,2,3], val =3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。
    示例 2:给定 nums = [0,1,2,2,3,0,4,2], val = 2,函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

    解题:

    class Solution {
        public int removeElement(int[] nums, int val) {
            int fast = 0;
            int slow = 0;
            for (fast = 0; fast < nums.length; fast++) {
                if(nums[fast] != val) {
                    nums[slow] = nums[fast];
                    slow ++;
                }
            }
            return slow;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、 比较含退格的字符串(两次循环的双指针)

    题目:

    给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
    注意:如果对空文本输入退格字符,文本继续为空

    实例1:

    输入:s = “ab#c”, t = “ad#c”
    输出:true
    解释:s 和 t 都会变成 “ac”。

    实例2:

    输入:s = “ab##”, t = “c#d#”
    输出:true
    解释:s 和 t 都会变成 “”。

    解题思路:对两个字符串分别进行退格操作,比较处理完毕后的字符串是否相同。

    两个常用java函数:
    str.toCharArray():将字符串转化为字符数组;
    String.ValueOf(字符数组,开始下标,转化长度):将字符数组转化为字符串

    解题:

    class Solution {
        public boolean backspaceCompare(String s, String t) {
            return changeString(s).equals(changeString(t));
        }
    
        public String changeString(String str){
            char[] strChar = str.toCharArray();
            int index = 0;
            for (int i = 0; i < strChar.length; i++) {
                if ('#' != strChar[i]) {
                    strChar[index++] = strChar[i];
                } else if (strChar[i] == '#' && index != 0) {
                    index --;
                }
            }
            return String.valueOf(strChar,0,index);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、有序数组的平方(解题特殊点:数组升序,可前后两个指针向数组临界点比较)

    题目:

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
    输入:nums =[-4,1,0,3,10]
    输出:[0,1,9,16,100]
    输入:nums = [-7,-3,2,3,11]
    输出:[4,9,9,49,121]
    解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]

    解题思路: 找到负数和非负数的临界点,从数组的两端向临界点比较大小并排序。

    解题:

    class Solution {
        public int[] sortedSquares(int[] nums) {
            int[] newNums = new int[nums.length];
            
            int left = 0,right = nums.length - 1,index = nums.length - 1;
            for (int i = 0; i < nums.length; i++) {
                if(nums[left] * nums[left] > nums[right] * nums[right]){
                    newNums[index] = nums[left] * nums[left];
                    left++;
                } else {
                    newNums[index] = nums[right] * nums[right];
                    right--;
                }
                index--;
            }
            return newNums;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    【CSS3入门指北】基础篇
    什么牌子的蓝牙耳机好?音质好的蓝牙耳机推荐
    Pinia(四)了解和使用getters
    CSS关于默认宽度
    Etsy玩家必看之7个运营技巧
    云服务器 宝塔部署SpringBoot前后端分离项目
    【EXCEL】SUMIFS多次条件筛选数据
    【深度学习】pix2pix GAN理论及代码实现
    verilog之wire vs reg区别
    硬件工程师经常犯的几个典型错误
  • 原文地址:https://blog.csdn.net/m0_46459413/article/details/133071441