1、二维数组 在空间中不一定都是连续的,比如java,c++底层对于二维数组也是连续的。

2、二分查找----不多阐述

3、移除元素(快慢指针)

要搞懂快慢指针分别的含义是什么

3.1 一道基本题 移除元素

https://leetcode.cn/problems/remove-element/description/

在这道题目中,快指针即我们要加入新数组的元素,慢指针即我们要加入新数组的下标。用一个for循环解决两个for循环的问题。

class Solution {
    public int removeElement(int[] nums, int val) {
      int slow=0;
      for(int fast=0;fast<nums.length;fast++){
        if(nums[fast]!=val){
            nums[slow++]=nums[fast];
        }
      }

3.2 删除有序数组中的重复项

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

这里 出现了一个bug,就是在for循环时,我的fast++,重复了,for循环本身fast++,结果我在代码中又++了一次。

class Solution {
    public int removeDuplicates(int[] nums) {
        int slow=0;
        for(int fast=1;fast<nums.length;fast++){
          if(nums[slow]!=nums[fast]){
                slow++;
                nums[slow]=nums[fast];
          }

        }
       return slow+1;
    }
}

slow+1是因为,这道题在判断时,是i<你输出的值,所以需要让索引+1。

3.3 移动零

https://leetcode.cn/problems/move-zeroes/description/

class Solution {
    public void moveZeroes(int[] nums) {
        if(nums.length==1)
            return;
        int slow=0;
        for(int fast=0;fast<nums.length;fast++){
            if(nums[fast]!=0){
                int temp=nums[slow];
                nums[slow]=nums[fast];
                nums[fast]=temp;
                slow++;
            }
        }
    }
}

3.4 比较含退格的字符串

https://leetcode.cn/problems/backspace-string-compare/description/

class Solution {
    public boolean backspaceCompare(String s, String t) {
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        int slow1 = solution(s1);
        int slow2 = solution(t1);
        if (slow1 != slow2)
            return false;
        for (int i = 0; i < slow1; i++) { // 使用索引 i 比较对应字符
            if (s1[i] != t1[i])
                return false;
        }
        return true;
    }

    public int solution(char[] s) {
        int slow = 0;
        for (int i = 0; i < s.length; i++) {
            if (s[i] != '#') {
                s[slow] = s[i];
                slow++;
            }  else{
                    if(slow>0)
                    slow--;
                }

        }
        return slow;
    }
}

题解:想法错了一点,就是 最后那里,如果fast=#时,slow要--,因为要退格。还有一点就是在slow>0时,slow才能--,比如##ab,刚开始slow=0,如果没有这个判断条件,则下标会出错。

还有一点就是 我把它当作c版本了,没有将string转换为char,但是java,Java 中的字符串是不可变的,无法通过索引下标来直接修改或访问其中的字符。我们可以将其转换为字符数组,Java 中的字符数组是可以通过下标来访问和修改的。字符数组是一种可变的数据结构,你可以在其特定索引位置上直接读取或修改字符。

3.5 有序数组的平方

https://leetcode.cn/problems/squares-of-a-sorted-array/description/

3.5.1 第一次的想法 ,只击败了 22%的用户,自己想的是最简单的做法,先取平方,之后通过归并排序。

class Solution {
    public static int MaxN=10005;
    public static int[] arr=new int[MaxN];
    public static int[] help=new int[MaxN];
    public int[] sortedSquares(int[] arr) {
        for(int i=0;i<arr.length;i++){
            arr[i]=(int)Math.pow(arr[i],2);
        }
         sort(arr,0,arr.length-1);
        return arr;
       
    }
   
    public static void sort(int[] arr,int l,int r){
        if(l==r)
            return;
        int m=(l+r)/2;
        sort(arr,l,m);
        sort(arr,m+1,r);
        merge(arr,l,m,r);
    }
    public static void merge(int[] arr,int l,int m,int r){
        int i=l;
        int a=l;
        int b=m+1;
        while(a<=m&&b<=r){
            help[i++]=arr[a]<=arr[b]?arr[a++]:arr[b++];
        }
        while (a<=m){
            help[i++]=arr[a++];
        }
        while (b<=r)
            help[i++]=arr[b++];
        for (int j = l; j <=r ; j++) {
            arr[j]=help[j];
        }
    }
}

3.5.2 带补充 没想到双指针在这里怎么用

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res=new int[nums.length];
        int i=0;
        int j=nums.length-1;
        int index=res.length-1;
        while(i<=j){
            if((int)Math.pow(nums[i],2)>(int)Math.pow(nums[j],2)){
                res[index--]=(int)Math.pow(nums[i],2);
                i++;
            }
            else{
                 res[index--]=(int)Math.pow(nums[j],2);
                j--;
            }
        }
        return res;
    }
}