【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. };

相關文章
相關標籤/搜索