27.移除元素
思路简述
这个题有两种方法,第一种是暴力,另一种是双指针法。而且需要注意的是不能使用额外的数组空间。
但这两种方法的本质相同,都是将不等于val的数移到数组左部,或者说,将等于val和不等于val的两部分进行分离。
暴力法的核心算法是每当遇到一个等于val的数nums[i]时,就将下标i之后的所有数都向前移一位,移完后将数组nums的size减1。最后返回size;
public static 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<size;j++) {
nums[j-1]=nums[j];
}
size--;
i--;
}
}
return size;
}
双指针法的核心算法在于设立left、right快慢指针,right指针任务是进行遍历,而left指针任务是保存值不是val的数,当right指针遇到不是val的数时,left指针将该数进行存储后右移。
left从左边界0开始,如果nums[right]不等于val,那么nums[left]=nums[right],同时left指针+1。最后返回的left指针,指向左部存储非val值的最后一位。
public int removeElement(int[] nums, int val) {
int left=0;
for(int right=0;right<nums.length;right++) {
if(nums[right]!=val) {
nums[left]=nums[right];
left++;
}
}
return left;
}
26.删除排序数组中的重复项
思路简述
首先要注意题目给出的是一个有序数组!换言之,重复的元素都是挨着的。
关键思路就是设置left和right指针(快慢指针),right指针负责遍历,left指针则负责判断right指针指向的元素是否和自己指向的元素相同,如果相同,则不动如山。如果不同,则left右移一位,并存储right指向的元素。即nums[left++]=nums[right];
注意,最后要返回left+1;因为是要返回数组的新长度。
public static int removeduplicates(int[] nums) {
int left=0;
for(int right=0;right<nums.length;right++) {
if(nums[right]!=nums[left]) {
nums[++left]=nums[right];
}
}
return left+1;
}
双指针套路合集
https://zhuanlan.zhihu.com/p/95747836
可看上面这个总结
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!