给定一个有序数组,删除其中部分元素,使得剩下的每个数最多出现2次。要求删除的数的数量尽可能少。
例如:
给出有序数组 A =[1,1,1,2,2,3],
你给出的函数应该返回length =5, A 变为[1,1,2,2,3].
class Solution {
public:
int removeDuplicates(int A[], int n) {
if(n<=2) return n;
int index=2;//允许重复两次,可以修改为三次
for(int i=2;i<n;i++)
{
if(A[i]!=A[index-2])//允许重复两次,可以修改为三次
A[index++]=A[i];
}
return index;
}
};
class Solution {
public:
int removeDuplicates(int A[], int n) {
int index=0;
for(int i=0;i<n;i++){
if(i>0&&i<n-1&&A[i]==A[i-1]&&A[i]==A[i+1])
continue;
A[index++]=A[i];
}
return index;
}
};
常规思路吧。。
public class Solution {
public int removeDuplicates(int[] A) {
if(A == null || A.length <= 0)
return 0;
int count = 1;
int inx = 0;
for(int i = 1; i < A.length; i++){
if(A[inx] != A[i]){
A[++inx] = A[i];
count = 1;
}
// 相等的时候多判断一次即可
else{
count++;
if(count < 3){
A[++inx] = A[i];
}
}
}
return inx + 1;
}
}
/*
* 目的:数组中元素最多容许重复两次
* 方法1:使用计数排序的思想,时间复杂度和空间复杂度都是O(n)
* 方法2:通过控制,插入重复数字的第一个和最后一个,
* 时间复杂度为O(n),空间复杂度为O(1)
* 方法3:扩展性比较强的方法,参考大佬
*/
//方法一:
int removeDuplicates(int A[], int n) {
if (A==nullptr|| n<=2)
return n;
map<int, int>st;
for (int i = 0; i< n;++i){
st[A[i]]++;
}
int len = 0;
for (auto it = st.begin();it!=st.end();++it){
for (int j = 0; j < min(2, it->second);++j){
A[len++]=it->first;
}
}
return len;
}
//方法二:
int removeDuplicates(int A[], int n) {
if (A==nullptr|| n<=2)
return n;
int length=0;
int count = 1;
for (int i = 0; i < n; ++i){
if (i == n-1 || A[i] !=A[i+1]){
A[length++] = A[i];
count = 1;
}
else{
count++;
if (count<3){
A[length++]= A[i];
}
}
}
return length;
}
//方法三:扩展性很强,如果容许重复三次,只需将间隔改为3即可
int removeDuplicates(int A[], int n) {
if (A==nullptr|| n<=2)
return n;
int index = 2;
for (int i = 2;i < n;++i){
if (A[i]!=A[index-2])
A[index++]=A[i];
}
return index;
} public class Solution {
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
int k = 1;// 保证nums中[0, k)中无出现两次以上元素
int count = 1;// 记录当前元素出现次数
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[k - 1]) {// 与上一次重复
if (count == 1) {// 当前为出现第二次
nums[k++] = nums[i];
count++;
}
} else {// 当前为新元素
count = 1;
nums[k++] = nums[i];
}
}
return k;
}
}
//思路很简单,就是用p和q双标志来遍历,p表示符合题目的下标,q表示原数组下标,每次先给p下标
//赋值q下标值,然后判断q后面是否有重复值,有的话,就让q指向最后一个重复着,给p+1再赋一次值
class Solution {
public:
int removeDuplicates(int A[], int n) {
if(n<=2)
return n;
int p,q;
p = 0;q = 0;
int flag;
while(q<n)
{
A[p++] = A[q];
flag = 0;
while(q+1<n && A[q]==A[q+1])
{
flag = 1;
q++;
}
if(flag)
A[p++] = A[q];
q++;
}
return p;
}
};
public class Solution {
public int removeDuplicates(int[] A) {
if (A == null || A.length <= 2) {
return A == null ? 0 : A.length;
}
int count = 2;
for (int i = 2; i < A.length; i++) {
if ( A[i] != A[count - 2]) {
A[count++] = A[i];//A[count]==A[i];count+1;
}
}
return count;
}
}
import java.util.*;
public class Solution {
public static int removeDuplicates(int[] A) {
if(A.length == 0) return 0;
List<Integer> list = new ArrayList<>();
list.add(A[0]);
int count = 1;
for (int i = 1; i < A.length; i ++ ) {
if(A[i] == A[i - 1]) count ++ ;
else count = 1;
if(count == 1 || count == 2) list.add(A[i]);
}
for (int i = 0; i < list.size(); i ++ ) {
A[i] = list.get(i);
}
return list.size();
}
}
int removeDuplicates(int* A, int ALen)
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < ALen - count - 2; i++)
{
//判断是否有重复3个的元素
if (A[i] == A[i + 1] && A[i + 1] == A[i + 2])
{
//记录已经删除的个数
count++;
//删除第3个元素
for (j = i + 2; j < ALen - count; j++)
{
A[j] = A[j + 1];
}
//返回上一元素,检查是否仍然重复3个
i--;
}
}
return ALen - count;
} 一个通用的思路:用index记录新数组的下标,遍历旧数组,如果当前元素与A[index-2]的元素不相同,则表示这个数应该放入新数组。(其中2可以变为1,3,4...)代码如下:
//
// Created by jt on 2020/9/24.
//
class Solution {
public:
int removeDuplicates(int A[], int n) {
if (n <= 2) return n;
int idx = 2;
for (int i = 2; i < n; ++i) {
if (A[idx-2] != A[i]) {
A[idx++] = A[i];
}
}
return idx;
}
};
class Solution {
public:
int removeDuplicates(int A[], int n) {
if(n<=2)
return n;
int k = 2;
int a,b;
a=A[0];
b=A[1];
for(int i=2;i<n;i++){
if(!(A[i]==a&& A[i]==b)){
a=A[i-1];
b=A[i];
A[k] = A[i];
k++;
}
}
return k;
}
}; public class Solution {
public int removeDuplicates(int[] A) {
if(A==null)
return 0;
int k = 0;
boolean two = false; //已经出现了2个相同
for(int i=1;i<A.length;i++){
if(A[i]==A[k]){
if(!two){
two = true;
A[++k] = A[i];
}
}else{
A[++k] = A[i];
two = false;
}
}
return k+1;
}
}