zoukankan      html  css  js  c++  java
  • No.80 Remove Duplicates from Sorted Array ||

    Remove Duplicates from Sorted Array|| 

    Follow up for "Remove Duplicates":
    What if duplicates are allowed at most twice?

    For example,
    Given sorted array nums = [1,1,1,2,2,3],

    Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn't matter what you leave beyond the new length.

    Tags: Array Two Pointers

    移除有序数组中出现次数超过两次的数字
    要求:原地移除,不能使用额外空间;返回新数组的长度
     1 #include "stdafx.h"
     2 #include <map>
     3 #include <vector>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 class Solution
     8 {
     9 public:
    10     int removeDuplicates(vector<int> &nums)
    11     {//移除有序数组中出现次数超过两次的数字
    12      //要求:原地移除,不能使用额外空间;返回新数组的长度
    13 
    14         int size = nums.size();
    15         if(size <= 2)
    16             return size;
    17         int index = 0;//已确定的最后索引
    18         bool isTwice = false;//是否一出现两次
    19         for(int i=1; i<size; i++)
    20         {
    21             if(nums[i] != nums[index])
    22             {
    23                 nums[++index] = nums[i];
    24                 isTwice = false;
    25             }
    26             else
    27             {
    28                 if(!isTwice)//重复,但此时为第二次出现
    29                 {
    30                     nums[++index] = nums[i];
    31                     isTwice = true;
    32                 }
    33             }
    34         }
    35         nums.erase(nums.begin()+index+1, nums.end());
    36         return index+1;
    37     }
    38 };
    39 
    40 int main()
    41 {
    42     Solution sol;
    43     int data[] = {1,1,1,2,2,3,3,3,3,3,4,5};
    44     vector<int> test(data,data+sizeof(data)/sizeof(int));
    45     for(const auto &i : test)
    46         cout << i << " ";
    47     cout << endl;
    48     cout<< boolalpha << sol.removeDuplicates(test)<<endl;
    49         for(const auto &i : test)
    50         cout << i << " ";
    51     cout << endl;    
    52 }

      其实,还有一种更简单的做法,不用isTwice标识,直接比较nums[index-1]即可[因为是排序过的]!!

     1 class Solution
     2 {
     3 public:
     4     int removeDuplicates(vector<int> &nums)
     5     {//移除有序数组中出现次数超过两次的数字
     6      //要求:原地移除,不能使用额外空间;返回新数组的长度
     7 
     8         int size = nums.size();
     9         if(size <= 2)
    10             return size;
    11         int index = 1;//已确定的最后索引
    12 
    13         for(int i=2; i<size; i++)//i从2开始
    14         {
    15             if(nums[i] != nums[index-1])
    16                 nums[++index] = nums[i];
    17         }
    18         nums.erase(nums.begin()+index+1, nums.end());
    19         return index+1;
    20     }
    21 };
  • 相关阅读:
    代码重构技术方法
    《算法导论》为什么经典
    BeagleBone Black教训四局:简单LED对照实验
    linux(Ubuntu)安装QQ2013
    ubuntu卸载qq2012
    android弧形进度条,有详细注释的,比较简单
    Android自定义进度条
    AndroidのUI设计研究(一)——自定义ProgressBar
    介绍几个工作开发中封装的好用的android自定义控件
    android自定义viewgroup之我也玩瀑布流
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4569631.html
Copyright © 2011-2022 走看看