前言
很多算法,不需要取模拟,模拟会有很多情况,你就需要很多if,甚至你if不过来,if中有if。
要学会多情况统一处理,让简洁的代码完成才是一条正确的路线。
一、删除有序数组中的重复项 II
二、双指针
package everyday.doublePoint;
public class RemoveDuplicates {
/*
target:原地修改数组,让已升序的数组中元素不能超过两个,即1-2个。最后返回前面修改好的有效元素个数。
一个指针指向实际可以赋值的位置,一个指针遍历nums所有元素,把合法的元素都赋值到实际的指针处。
用一个变量记录记录不合法的数字,用nums.length - 不合法个数即为实际长度。
*/
public int removeDuplicates(int[] nums) {
// 实际可以赋值的位置。
int real = 0;
// 记录前一个变量是谁,以及已经重复了多少这个变量。
int pre = 1 << 31, sameNum = 0;
// 记录数组的有效长度。
int len = nums.length;
// 第二个指针遍历nums数组,筛选符合条件的数。
for (int i = 0; i < nums.length; i++) {
// 和前面不等,新值,需要重设pre/sameNum,且把符合条件的值赋值到real处。
if (pre != nums[i]) {
pre = nums[i];
sameNum = 1;
nums[real++] = nums[i];
}
// 相同元素还不超过2
else if (sameNum++ < 2) nums[real++] = nums[i];
// 相同元素超过2,无效元素
else --len;
}
return len;
}
}
总结
1)双指针
2)找到一个可以统一的处理方式,就是一种算法。