题目:
从有序数组里移除重复出现元素,最多重复出现2次
思路:
多用一个cnt来记录重复次数,只复制第一次重复,之后再重复就不管了
这是一类典型的题,思路是,一开始可以再开一个辅助数组,这样会更直观一些。如果新数组改变不会影响原数组,则可以合并起来,如本题。
这道题是前面题的follow up,前面题是如果出现了重复元素,则完全移除。
http://blog.youkuaiyun.com/fightforyourdream/article/details/12719683
package Level2;
import java.util.Arrays;
/**
* Remove Duplicates from Sorted Array II
*
* Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array A = [1,1,1,2,2,3],
Your function should return length = 5, and A is now [1,1,2,2,3].
*/
public class S80 {
public static void main(String[] args) {
// int[] A = {1,1,1,1,2,2,2,3};
int[] A = {1,2,2};
int k = removeDuplicates(A);
for(int i=0; i<k; i++){
System.out.print(A[i] + " ");
}
}
// 很经典的一道题!
// 思路是,一开始可以再开一个辅助数组,这样会更直观一些。
// 如果新数组改变不会影响原数组,则可以合并起来,如本题
public static int removeDuplicates(int[] A) {
// i用来遍历数组,j保存新数组的最后位置
int i = 1, j = 0;
int cnt = 0;
if(A.length < 3){
return A.length;
}
for(; i<A.length; i++){
if(A[i] == A[j]){ // 重复的情况
if(cnt == 0){ // 当且仅当重复一次(共出现两次)的情况下才复制
A[++j] = A[i];
}
cnt++;
}else{ // 不重复的情况,更新j的位置,然后直接复制过去
A[++j] = A[i];
cnt = 0; // 重置counter
}
}
return j+1;
}
}
其实可以不用Hashtable的,因为已经有序了!
import java.util.*;
public class Solution {
public int removeDuplicates(int[] A) {
Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>();
int i=0, j=0;
for(i=0; i<A.length; i++){
Integer val = ht.get(A[i]);
if(val == null){
ht.put(A[i], 1);
A[j++] = A[i];
}else if(val < 2){
ht.put(A[i], 2);
A[j++] = A[i];
}
}
return j;
}
}