`
frank-liu
  • 浏览: 1666036 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Remove Duplicates from Sorted Array II

 
阅读更多

问题描述:

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 1122 and 3. It doesn't matter what you leave beyond the new length.

原问题链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/

 

问题分析

初始方法

  这是一个比较容易想到的办法,就是既然每个元素只允许出现两次,我们可以用一个map来记录每个元素出现的次数。同时用一个计数器来统计所有出现的合法的字符。在遍历整个列表的时候,判断每个元素,如果这个元素不在这个map里,则统计数coun++,并将这个值和对应的出现次数1加入到map中。如果map里有这个元素,但是出现的次数小于2,则count++,并将对应的出现次数加1。这里需要对元素做一个交换的操作,保证最后元素的顺序符合要求。

  详细的实现如下:

 

public class Solution {
    public int removeDuplicates(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int count = 0;
        for(int i = 0; i < nums.length; i++) {
            int item = nums[i];
            if(map.containsKey(item)) {
                if(map.get(item) < 2) {
                    map.put(item, map.get(item) + 1);
                    swap(nums, count++, i);
                }
            } else {
                map.put(item, 1);
                swap(nums, count++, i);
            }
        }
        return count;
    }
    
    private void swap(int[] a, int i, int j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
}

  这种思路比较容易想到,但是由于里面有大量的类型boxing, unboxing,所以它的执行效率受到比较大的影响。 

 

改进方法

  实际上如果仔细分析问题描述中的要求,我们还有一些地方没有利用上。比如说它里面给定的元素都是排序的。这是一个非常有用的地方。既然都是排序的,那么我们不用费劲去用一个map来保存元素了。只要从头往后遍历的时候去看这个元素,如果它当前的值比它索引之前两个位置的元素大,那么说明这个元素和前面的不同,需要将它加入到数组前面去。我们用一个变量i来表示符合条件的元素的索引。同时,针对数组长度的情况,要考虑当前索引小于2的边界情况。

  这种实现更加简单高效,详细的代码实现如下:

 

public class Solution {
    public int removeDuplicates(int[] nums) {
        int i = 0;
        for (int n : nums)
            if (i < 2 || n > nums[i - 2])
                nums[i++] = n;
        return i;
    }
}

 

1
0
分享到:
评论

相关推荐

    LeetCode Remove Duplicates from Sorted Array解决方案

    LeetCode Remove Duplicates from Sorted Array解决方案

    26.Remove Duplicates from Sorted Array删除有序数组中的重复项【LeetCode单题讲解系列】

    26.Remove_Duplicates_from_Sorted_Array删除有序数组中的重复项【LeetCode单题讲解系列

    leetcode算法题主函数如何写-leetcode:leetcode

    leetcode算法题主函数如何写 leetcode 每日一题 从今天开始,每天必须完成至少2题。即为保持写代码的手感,也巩固一下编码的基础知识。 2018.1.23 题目:Remove Duplicates from Sorted Array Given a sorted array,...

    lrucacheleetcode-LeetCode:这个库用于总结leetcode中遇到的习题,期望按照数据结构和常用方法分成2类,进行总结,

    leetcode LeetCode 这个库用于总结leetcode中遇到的习题 常用数据结构习题总结 1.线性表 解决进度 No. Describition mark 1 Remove Duplicates from Sorted Array 2 Remove Duplicates from Sorted Array II 3 ...

    javalruleetcode-LeetCode::lollipop:个人LeetCode习题解答仓库-多语言

    java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode ...Duplicates from Sorted Array 48 Rotate Image 53 Maximum Subarray 55 Jump Game 56 Merge Intervals 64 Minimum Path Sum 73

    leetcode答案-LeetCode:Swift中的LeetCode

    leetcode 答案LeetCode LeetCode in Swift 这个Repo 用来存下我在LeetCode 解题的原始档,包含解题中遇到的错误,也包含解出AC 的答案, 以下的清单将连结到我的Github Pages 中,皆有题目中文翻译与解题的过程。...

    leetcode1004-leetcode:leetcode

    leetcode 1004 leetcode E:简单,M:中等,H:困难 数组和字符串 217. Contains Duplicate (E) 48. Rotate Image (M) -&gt; 2 73. Set Matrix Zeroes (M) 1. Two Sum (E) 167. Two Sum II - Input array is sorted (E)...

    lrucacheleetcode-leetcode:leetcode

    lru缓存leetcode leetcode 1. Two Sum 2. Add Two Numbers 3. Longest Substring Without Repeating Characters 4. Median of Two Sorted Arrays 5. Longest Palindromic Substring 7. Reverse Integer 9. ...

    leetcode打不开-leetcode:leetcode

    leetcode打不开Leetcode Note Tips Tip1: Two pointer for sorted array (#Array 1. Two Sum) Tip2: Sum[i:j] = Sum[0:j] - Sum[0:i] for continuous array (# Array 560. Subarray Sum Equals K) Tip3: Knapsack ...

    leetcodepython001-LeetCode:力码

    leetcode python 001 LeetCode 建立两个个主要资料夹(题目收集、学习内容)+一个玩整的README整理 题目 主要以Python记录于VScode上 先记录头150题 学习 以JupyterNotebook为主 纪录各种资料结构、演算法等 ...

    leetcode写题闪退-LeetCode:leetcodeOJ

    leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...

    leetcode叫数-leetcode:leetcode

    leetcode叫数 Leetcode Personal repository implement with Ruby 13. Roman to Integer 查表,通过从前往前筛选字符串,把代表的值一个个加起来 26. Remove Duplicates from Sorted Array 难度easy的题目。根据题目...

    leetcode2sumc-LeetCode:LeetCode的一些题目

    leetcode 2 sum c LeetCode 帮助文档 帮助文档存放在Help文件夹下。 文件名 文件描述 链接 complexitypython.txt Python的一些常规操作的复杂度统计 题目清单 Array(数组) ID Difficulty Title Java Python 1 Easy ...

    Leetcode经典01背包-algo:一些记录

    Leetcode经典01背包 algo 1. 数据结构与算法 数组,链表,(串和序列) 堆,栈,队列 树,图 排序,搜索 贪心,回溯,动态规划 堆:一种完全二叉树,任意节点大于左右孩子(大顶堆) 树:二叉树,DFS,BFS 1 排序与...

    test2.1.1_2.1.2.rar_网络编程_C++_

    leetcode 代码Remove Duplicates from Sorted Array

    leetcode-remove-duplicates-from-sorted-array

    leetcode从重复数组中删除重复项 给定一个已排序的数组nums,就地删除重复项,以使每个元素仅出现一次并返回新的长度。 不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这...

    LeetCode判断字符串是否循环-LeetCode:LeetCode问题的Javascript解决方案

    LeetCode判断字符串是否循环 LeetCode Javascript Solutions to problems on LintCode # question difficulty 1 Two Sum Easy 2 Add Two Numbers Medium 3 Longest Substring Without Repeating Characters Medium 4...

    LeetCode:LeetCode题解

    Remove_Duplicates_From_Sorted_Array_II Java 中等的 88 合并排序数组 Java 简单的 121 Best_Time_To_Buy_And_Sell_Stock Java 简单的 122 Best_Time_To_Buy_And_Sell_StockII Java 简单的 125 Valid_...

    LeetCode C++全解

    Remove Duplicates from Sorted Array iii. Plus One iv. Pascal's Triangle v. Merge Sorted Array vi. Sum vii. Find Minimum in Rotated Sorted Array viii. Largest Rectangle in Histogram ix. Maximal ...

    cpp-算法精粹

    Remove Duplicates from Sorted Array II Longest Consecutive Sequence Two Sum 3Sum 3Sum Closest 4Sum Remove Element Move Zeroes Next Permutation Permutation Sequence Valid Sudoku Trapping Rain Water ...

Global site tag (gtag.js) - Google Analytics