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 };
  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4569631.html
Copyright © 2011-2022 走看看