import java.util.*;
/**
* NC394 删除升序数组的重复元素(二)
* @author d3y1
*/
public class Solution {
// 重复次数
private final int K = 2;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int removenums (ArrayList<Integer> nums) {
// return solution1(nums);
// return solution2(nums);
// return solution3(nums);
// return solution4(nums);
// return solution5(nums);
// return solution6(nums);
return solution7(nums);
}
/**
* 新增法(add): 未通过(非原地修改nums数组!)
* @param nums
* @return
*/
private int solution1(ArrayList<Integer> nums){
HashMap<Integer,Integer> map = new HashMap<>();
ArrayList<Integer> list = new ArrayList<>();
int cnt;
for(int num: nums){
cnt = map.getOrDefault(num, 0);
if(cnt < K){
list.add(num);
map.put(num, cnt+1);
}
}
return list.size();
}
/**
* 删除法(remove): Iterator+HashMap
* @param nums
* @return
*/
private int solution2(ArrayList<Integer> nums){
HashMap<Integer,Integer> map = new HashMap<>();
int num,cnt;
Iterator<Integer> it = nums.iterator();
while(it.hasNext()){
num = it.next();
cnt = map.getOrDefault(num, 0);
if(cnt < K){
map.put(num, cnt+1);
}else{
it.remove();
}
}
return nums.size();
}
/**
* 删除法(remove): Iterator
* 利用 "有序数组" 属性
* @param nums
* @return
*/
private int solution3(ArrayList<Integer> nums){
int cur = nums.get(0);
int num,cnt=0;
Iterator<Integer> it = nums.iterator();
while(it.hasNext()){
num = it.next();
if(num == cur){
if(cnt < K){
cnt++;
}else{
it.remove();
}
}else{
cur = num;
cnt = 1;
}
}
return nums.size();
}
/**
* 删除法(remove): index(从后往前遍历)
* @param nums
* @return
*/
private int solution4(ArrayList<Integer> nums){
int n = nums.size();
int cnt = 1;
for(int i=n-2; i>=0; i--){
if(nums.get(i).equals(nums.get(i+1))){
if(cnt < K){
cnt++;
}else{
nums.remove(i);
}
}else{
cnt = 1;
}
}
return nums.size();
}
/**
* 删除法(remove): index(从前往后遍历)
* @param nums
* @return
*/
private int solution5(ArrayList<Integer> nums){
int n = nums.size();
int cnt = 1;
for(int i=1; i<n; i++){
if(nums.get(i-1).equals(nums.get(i))){
if(cnt < K){
cnt++;
}else{
nums.remove(i);
n--;
i--;
}
}else{
cnt = 1;
}
}
return nums.size();
}
/**
* 更新法(set): 双指针
* @param nums
* @return
*/
private int solution6(ArrayList<Integer> nums){
int n = nums.size();
int cnt = 1;
// 双指针
int i = 1;
for(int j=1; j<n; j++){
if(nums.get(j-1).equals(nums.get(j))){
if(cnt < K){
cnt++;
nums.set(i, nums.get(j));
i++;
}
}else{
cnt = 1;
nums.set(i, nums.get(j));
i++;
}
}
return i;
}
/**
* 更新法(set): 双指针
* @param nums
* @return
*/
private int solution7(ArrayList<Integer> nums){
int n = nums.size();
int cnt = 1;
// 双指针
int i = 0;
for(int j=1; j<n; j++){
if(nums.get(j-1).equals(nums.get(j))){
if(cnt < K){
cnt++;
i++;
nums.set(i, nums.get(j));
}
}else{
cnt = 1;
i++;
nums.set(i, nums.get(j));
}
}
return i+1;
}
}