【leetcode系列】26. 删除排序数组中的重复项

 

题目描述

给定一个排序数组,你须要在原地删除重复出现的元素,使得每一个元素只出现一次,返回移除后数组的新长度。javascript

 

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。php

 

示例 1:java

 

给定数组 nums = [1,1,2], 算法

 

函数应该返回新的长度 2, 而且原数组 nums 的前两个元素被修改成 1, 2。 数组

 

你不须要考虑数组中超出新长度后面的元素。app

示例 2:ide

 

给定 nums = [0,0,1,1,1,2,2,3,3,4],函数

 

函数应该返回新的长度 5, 而且原数组 nums 的前五个元素被修改成 0, 1, 2, 3, 4。this

 

你不须要考虑数组中超出新长度后面的元素。spa

说明:

 

为何返回数值是整数,但输出的答案是数组呢?

 

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

 

你能够想象内部操做以下:

 

  1. // nums is passed in by reference. (i.e., without making a copy)

  2. int len = removeDuplicates(nums);

  3.  

  4. // any modification to nums in your function would be known by the caller.

  5. // using the length returned by your function, it prints the first len elements.

  6. for (int i = 0; i < len; i++) {

  7. print(nums[i]);

  8. }

思路

使用快慢指针来记录遍历的坐标。

  • 开始时这两个指针都指向第一个数字

  • 若是两个指针指的数字相同,则快指针向前走一步

  • 若是不一样,则两个指针都向前走一步

  • 当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不一样数字的个数

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

关键点解析

  • 双指针

这道题若是不要求,O(n)的时间复杂度, O(1)的空间复杂度的话,会很简单。 可是这道题是要求的,这种题的思路通常都是采用双指针

  • 若是是数据是无序的,就不能够用这种方式了,从这里也能够看出排序在算法中的基础性和重要性。

代码

  1. /*

  2. * @lc app=leetcode id=26 lang=javascript

  3. *

  4. * [26] Remove Duplicates from Sorted Array

  5. *

  6. * https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/

  7. *

  8. * algorithms

  9. * Easy (39.76%)

  10. * Total Accepted: 539.7K

  11. * Total Submissions: 1.4M

  12. * Testcase Example: '[1,1,2]'

  13. *

  14. * Given a sorted array nums, remove the duplicates in-place such that each

  15. * element appear only once and return the new length.

  16. *

  17. * Do not allocate extra space for another array, you must do this by modifying

  18. * the input array in-place with O(1) extra memory.

  19. *

  20. * Example 1:

  21. *

  22. *

  23. * Given nums = [1,1,2],

  24. *

  25. * Your function should return length = 2, with the first two elements of nums

  26. * being 1 and 2 respectively.

  27. *

  28. * It doesn't matter what you leave beyond the returned length.

  29. *

  30. * Example 2:

  31. *

  32. *

  33. * Given nums = [0,0,1,1,1,2,2,3,3,4],

  34. *

  35. * Your function should return length = 5, with the first five elements of nums

  36. * being modified to 0, 1, 2, 3, and 4 respectively.

  37. *

  38. * It doesn't matter what values are set beyond the returned length.

  39. *

  40. *

  41. * Clarification:

  42. *

  43. * Confused why the returned value is an integer but your answer is an array?

  44. *

  45. * Note that the input array is passed in by reference, which means

  46. * modification to the input array will be known to the caller as well.

  47. *

  48. * Internally you can think of this:

  49. *

  50. *

  51. * // nums is passed in by reference. (i.e., without making a copy)

  52. * int len = removeDuplicates(nums);

  53. *

  54. * // any modification to nums in your function would be known by the caller.

  55. * // using the length returned by your function, it prints the first len

  56. * elements.

  57. * for (int i = 0; i < len; i++) {

  58. * print(nums[i]);

  59. * }

  60. *

  61. */

  62. /**

  63. * @param {number[]} nums

  64. * @return {number}

  65. */

  66. var removeDuplicates = function(nums) {

  67. const size = nums.length;

  68. let slowP = 0;

  69. for (let fastP = 0; fastP < size; fastP++) {

  70. if (nums[fastP] !== nums[slowP]) {

  71. slowP++;

  72. nums[slowP] = nums[fastP]

  73. }

  74. }

  75. return slowP + 1;

  76. };

相关文章
相关标签/搜索