问题描述:
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.
原问题链接: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; } }
相关推荐
"LeetCode Remove Duplicates from Sorted Array解决方案" 本文将详细介绍 LeetCode 中的 Remove Duplicates from Sorted Array 解决方案,包括问题描述、解决方案和关键知识点。 问题描述: 给定一个排序的数组 ...
26.Remove_Duplicates_from_Sorted_Array删除有序数组中的重复项【LeetCode单题讲解系列
leetcode算法题主函数如何写 leetcode 每日一题 从今天开始,每天必须完成至少2题。即为保持写代码的手感,也巩固一下编码的基础知识。 2018.1.23 题目:Remove Duplicates from Sorted Array Given a sorted array,...
c c语言_leetcode 0026_remove_duplicates_from_sorted_array.zip
leetcode LeetCode 这个库用于总结leetcode中遇到的习题 常用数据结构习题总结 1.线性表 解决进度 No. Describition mark 1 Remove Duplicates from Sorted Array 2 Remove Duplicates from Sorted Array II 3 ...
python python_leetcode题解之080_Remove_Duplicates_from_Sorted_Array_II
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
c c语言_leetcode题解之0080_remove_duplicates_from_sorted_array_ii.zip
javascript js_leetcode题解之80-remove-duplicates-from-sorted-array-ii.js
java入门 java_leetcode题解之026_Remove_Duplicates_from_Sorted_Array
leetcode 答案LeetCode LeetCode in Swift 这个Repo 用来存下我在LeetCode 解题的原始档,包含解题中遇到的错误,也包含解出AC 的答案, 以下的清单将连结到我的Github Pages 中,皆有题目中文翻译与解题的过程。...
c语言入门 C语言_leetcode题解之26-remove-duplicates-from-sorted-array.c
js js_leetcode题解之26-remove-duplicates-from-sorted-array.js
leetcode 1004 leetcode E:简单,M:中等,H:困难 数组和字符串 217. Contains Duplicate (E) 48. Rotate Image (M) -> 2 73. Set Matrix Zeroes (M) 1. Two Sum (E) 167. Two Sum II - Input array is sorted (E)...
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 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 ...
leetcode python 001 LeetCode 建立两个个主要资料夹(题目收集、学习内容)+一个玩整的README整理 题目 主要以Python记录于VScode上 先记录头150题 学习 以JupyterNotebook为主 纪录各种资料结构、演算法等 ...
leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...
leetcode叫数 Leetcode Personal repository implement with Ruby 13. Roman to Integer 查表,通过从前往前筛选字符串,把代表的值一个个加起来 26. Remove Duplicates from Sorted Array 难度easy的题目。根据题目...