给一个有序整数数组,数组中的每个元素,最多只能重复出现K次。80题中,K=2;26题中,K=1。
先贴代码:
public class Solution80 {
private static final int K = 2;
/**
* @param nums it's sorted!
*/
public int removeDuplicates(int[] nums) {
if (nums.length < K + 1) { // 入参判断
return nums.length;
}
int pos = K;
for (int i = K; i < nums.length; i++) {
if (nums[i] != nums[pos - K]) { // 判断当前的这三个数是否满足要求
nums[pos++] = nums[i];
}
}
return pos;
}
public static void main(String[] args) {
int[] nums = new int[] { 1, 1, 1, 2, 2, 3 };
// int[] nums = new int[] { 0, 0, 1, 1, 1, 1, 2, 3, 3 };
System.out.println(Arrays.toString(nums));
System.out.println(new Solution80().removeDuplicates(nums));
System.out.println(Arrays.toString(nums));
}
}
关键思路:
假设K=2,则数组中,要求一个元素最多重复出现两次。
1. 任意给定两个数,不论是否重复,肯定都满足要求。
2. 现在任意给三个数1,1,1,要保证这三个数满足要求,由于数组本身是有序的,只用将第三个数和第一个数比较,若相同,则这三个数肯定都相同,不满足题目要求;若不同,则这三个数中,每个数最多重复出现两次,满足要求。
3. 通过for循环,依次判断彼此相邻的三个数是否满足要求(思路2.),若满足,则下标i++,判断下一个三个数是否满足要求;若不满足,由思路1.,剔除掉第三个数,比较 由前两个数和现在这个数 组成的三个数,是否满足要求。
可能有点绕口Orz。直接来模拟一下,或者debug一下程序:
现在任意给N个数n0,n1...,nN-1,假设为1,1,1,2,2,3,按照上面的思路,
从下标2开始,用pos保存正在比较的三个数中第一个数的位置(pos-2)。
for循环:
判断n0,n1,n2是否满足要求:不满足,将n2剔除
判断n0,n1,n3是否满足要求:满足
判断n1,n3,n4(n2已被剔除)是否满足要求:满足
判断n3,n4,n5是否满足要求:满足
最后得到有1,1,2,2,3组成的长度为5的数组。
有了思路,再在纸上模拟一下,代码就很好写出来了。
第80题的K值为2,26题K值为1。再遇到相同的问题,改一下K值就可以了。
以上是我对这两道题目的理解,可能解释的不是很清楚,结合代码debug一下的话应该就没问题了。
欢迎讨论。嘿嘿。