給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素只出現一次,返回移除後數組的新長度。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
說明:
爲何返回數值是整數,但輸出的答案是數組呢?
請注意,輸入數組是以「引用」方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。
你能夠想象內部操做以下:
// nums is passed in by reference. (i.e., without making a copy)
int len = removeDuplicates(nums);
// any modification to nums in your function would be known by the caller.
// using the length returned by your function, it prints the first len elements.
for (int i = 0; i < len; i++) {
print(nums[i]);
}
使用快慢指針來記錄遍歷的座標。
開始時這兩個指針都指向第一個數字
若是兩個指針指的數字相同,則快指針向前走一步
若是不一樣,則兩個指針都向前走一步
當快指針走完整個數組後,慢指針當前的座標加1就是數組中不一樣數字的個數
雙指針
這道題若是不要求,O(n)的時間複雜度, O(1)的空間複雜度的話,會很簡單。 可是這道題是要求的,這種題的思路通常都是採用雙指針
若是是數據是無序的,就不能夠用這種方式了,從這裏也能夠看出排序在算法中的基礎性和重要性。
/*
* @lc app=leetcode id=26 lang=javascript
*
* [26] Remove Duplicates from Sorted Array
*
* https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/
*
* algorithms
* Easy (39.76%)
* Total Accepted: 539.7K
* Total Submissions: 1.4M
* Testcase Example: '[1,1,2]'
*
* Given a sorted array nums, remove the duplicates in-place such that each
* element appear only once and return the new length.
*
* Do not allocate extra space for another array, you must do this by modifying
* the input array in-place with O(1) extra memory.
*
* Example 1:
*
*
* Given nums = [1,1,2],
*
* Your function should return length = 2, with the first two elements of nums
* being 1 and 2 respectively.
*
* It doesn't matter what you leave beyond the returned length.
*
* Example 2:
*
*
* Given nums = [0,0,1,1,1,2,2,3,3,4],
*
* Your function should return length = 5, with the first five elements of nums
* being modified to 0, 1, 2, 3, and 4 respectively.
*
* It doesn't matter what values are set beyond the returned length.
*
*
* Clarification:
*
* Confused why the returned value is an integer but your answer is an array?
*
* Note that the input array is passed in by reference, which means
* modification to the input array will be known to the caller as well.
*
* Internally you can think of this:
*
*
* // nums is passed in by reference. (i.e., without making a copy)
* int len = removeDuplicates(nums);
*
* // any modification to nums in your function would be known by the caller.
* // using the length returned by your function, it prints the first len
* elements.
* for (int i = 0; i < len; i++) {
* print(nums[i]);
* }
*
*/
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
const size = nums.length;
let slowP = 0;
for (let fastP = 0; fastP < size; fastP++) {
if (nums[fastP] !== nums[slowP]) {
slowP++;
nums[slowP] = nums[fastP]
}
}
return slowP + 1;
};