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;
}
}