双指针算法题入门

双指针

双指针法是一种常用于数组或链表的算法思想,它通过维护两个指针,在特定条件下,以不同的步进方式移动指针,从而解决一些问题。双指针法包括快慢指针、左右指针等不同的变种,用于解决不同类型的问题。

常见的双指针法:

  1. 快慢指针: 两个指针分别以不同的速度遍历数组或链表,用于解决一些与连续序列、环等相关的问题。典型应用场景包括判断链表是否有环、找到环的起点、判断链表的中点等。
  2. 左右指针: 两个指针分别从数组或字符串的两端开始向中间移动,用于解决一些与区间、滑动窗口等相关的问题。典型应用场景包括在有序数组中寻找两个数之和、三个数之和等。

基本思路:

  1. 同向双指针: 两个指针的移动方向相同,一般用于有序数组或链表。
  2. 反向双指针: 两个指针的移动方向相反,一般用于满足一些特定条件的问题,如回文字符串判断。

具体应用举例:

快慢指针:
  • 判断链表是否有环: 使用两个指针,一个慢指针每次移动一步,一个快指针每次移动两步,如果存在环,快指针最终会追上慢指针。
  • 找到链表的中点: 使用两个指针,一个慢指针每次移动一步,一个快指针每次移动两步,当快指针到达链表末尾时,慢指针正好指向中点。
左右指针:
  • 在有序数组中寻找两个数之和: 使用左右两个指针,根据两个指针指向的元素之和与目标值的关系,调整指针的位置,直到找到目标值。
  • 反转字符串: 使用左右两个指针,依次交换左右指针指向的字符,直到字符串被反转。

双指针法的优点在于它通常能够以较低的时间复杂度解决问题,同时只需要常数级的额外空间。这使得双指针法成为解决一些空间复杂度要求较低的问题的有效方法。

1移除元素27

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

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。‘

思路:该道题有两个目的,你需要删除原数组中的相同元素,

1.不同于val的元素得放到数组的前边 。2.输出删除后数组的长度。

若使用双指针,则快指针负责遍历,慢指针负责删除后的长度,

public class 移除元素27 {
    //算是双指针的基本使用
    public int removeElement(int[] nums, int val) {
        int a=0;//慢指针
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i] != val) {        //快指针
                nums[a] = nums[i];      //将后边不等于a的元素移到前边 
                a=a+1;                  //计算不等于val的长度
            }
        }
        return a;                        //返回长度
    }
}

2反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

正常写法:

其实也算是一种简单的双指针,定义在了数组左右两侧,向中间移动,太简单就不说了

 public void reverseString(char[] s) {
       char temp=' ';    //定义一个中间量
        for (int i = 0; i <s.length/2 ; i++) {
            temp=s[i];
            s[i]=s[s.length-1-i];
            s[s.length-1-i]=temp;
        }
    }

这周写

你可能感兴趣的:(算法,后端,java,数据结构)