前言
我們社區(qū)陸續(xù)會(huì)將顧毅(Netflix 增長黑客,《iOS 面試之道》作者拐揭,ACE 職業(yè)健身教練撤蟆。)的 Swift 算法題題解整理為文字版以方便大家學(xué)習(xí)與閱讀。
LeetCode 算法到目前我們已經(jīng)更新了 79 期堂污,我們會(huì)保持更新時(shí)間和進(jìn)度(周一家肯、周三、周五早上 9:00 發(fā)布)盟猖,每期的內(nèi)容不多讨衣,我們希望大家可以在上班路上閱讀换棚,長久積累會(huì)有很大提升。
不積跬步反镇,無以至千里固蚤;不積小流,無以成江海歹茶,Swift社區(qū) 伴你前行夕玩。如果大家有建議和意見歡迎在文末留言,我們會(huì)盡力滿足大家的需求惊豺。
難度水平:中等
1. 描述
給你一個(gè)有序數(shù)組 nums
燎孟,請(qǐng)你 原地 刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素 最多出現(xiàn)兩次 尸昧,返回刪除后數(shù)組的新長度揩页。
不要使用額外的數(shù)組空間,你必須在 原地
修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成彻磁。
說明:
為什么返回?cái)?shù)值是整數(shù),但輸出的答案是數(shù)組呢狸捅?
請(qǐng)注意衷蜓,輸入數(shù)組是以 「引用」 方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的尘喝。
你可以想象內(nèi)部操作如下:
// nums 是以“引用”方式傳遞的磁浇。也就是說,不對(duì)實(shí)參做任何拷貝
int len = removeDuplicates(nums);
// 在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的朽褪。
// 根據(jù)你的函數(shù)返回的長度, 它會(huì)打印出數(shù)組中 該長度范圍內(nèi) 的所有元素置吓。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
2. 示例
示例 1
輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]
解釋:函數(shù)應(yīng)返回新長度 length = 5, 并且原數(shù)組的前五個(gè)元素被修改為 1, 1, 2, 2, 3 。 不需要考慮數(shù)組中超出新長度后面的元素缔赠。
示例 2
輸入:nums = [0,0,1,1,1,1,2,3,3]
輸出:7, nums = [0,0,1,1,2,3,3]
解釋:函數(shù)應(yīng)返回新長度 length = 7, 并且原數(shù)組的前五個(gè)元素被修改為 0, 0, 1, 1, 2, 3, 3 衍锚。 不需要考慮數(shù)組中超出新長度后面的元素。
約束條件:
1 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
-
nums
已按升序排列
3. 答案
class RemoveDuplicatesFromSortedArrayII {
func removeDuplicates(inout nums: [Int]) -> Int {
guard nums.count > 2 else {
return nums.count
}
var index = 1
for i in 2..<nums.count {
if nums[index] != nums[index - 1] || nums[index] != nums[i] {
index += 1
nums[index] = nums[i]
}
}
return index + 1
}
}
- 主要思想:保留一個(gè)索引嗤堰,比較該索引處的元素戴质、索引- 1處的元素以及向前移動(dòng)的元素。
- 時(shí)間復(fù)雜度: O(n)
- 空間復(fù)雜度: O(1)
該算法題解的倉庫:LeetCode-Swift
點(diǎn)擊前往 LeetCode 練習(xí)
關(guān)于我們
我們是由 Swift 愛好者共同維護(hù)踢匣,我們會(huì)分享以 Swift 實(shí)戰(zhàn)告匠、SwiftUI、Swift 基礎(chǔ)為核心的技術(shù)內(nèi)容离唬,也整理收集優(yōu)秀的學(xué)習(xí)資料后专。
后續(xù)還會(huì)翻譯大量資料到我們公眾號(hào),有感興趣的朋友输莺,可以加入我們戚哎。