【算法-高级-数组】删除排序数组中的反复项(多语言版实现)
博客阐明与致谢
文章所波及的局部材料来自互联网整顿,其中蕴含本人集体的总结和认识,分享的目标在于共建社区和坚固本人。
援用的材料如有侵权,请分割自己删除!
❤️❤️❤️ 感激万能的网络!
以及勤奋的本人,集体博客,GitHub学习,GitHub
公众号【归子莫】,小程序【子莫说】
如果你感觉对你有帮忙的话,无妨给我点赞激励一下,好文记得珍藏哟!关注我一起成长!
幸好我在,感激你来!
算法阐明
语言只是实现算法的一种伎俩,思路才是最为重要的。
如果有多种解法的话,只选一种语言作为解答比照。
如果独自将某一种算法的话,会以多种语言实现,比照语言的个性。
因为多对多的话,篇幅会拉的比拟大,影响观看体验!
题目
地址
26. 删除有序数组中的反复项
给你一个有序数组 nums ,请你 原地 删除反复呈现的元素,使每个元素 只呈现一次 ,返回删除后数组的新长度。
题目阐明
不要应用额定的数组空间,你必须在 原地 批改输出数组 并在应用 O(1) 额定空间的条件下实现。
阐明
为什么返回数值是整数,但输入的答案是数组呢?
请留神,输出数组是以「援用」形式传递的,这意味着在函数里批改输出数组对于调用者是可见的。
你能够设想外部操作如下:
// nums 是以“援用”形式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里批改输出数组对于调用者是可见的。// 依据你的函数返回的长度, 它会打印出数组中 该长度范畴内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}
示例 1
输出:nums = [1,1,2]输入:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被批改为 1, 2 。不须要思考数组中超出新长度前面的元素。
示例 2
输出:nums = [0,0,1,1,1,2,2,3,3,4]输入:5, nums = [0,1,2,3,4]解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被批改为 0, 1, 2, 3, 4 。不须要思考数组中超出新长度前面的元素。
提醒
0 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums 已按升序排列
思路
暴力想法
(留神是暴力想法,不是暴力解法!)
作为直男间接就是想实现。
间接遍历,看题目是曾经确定了是有序的,遇到与上一个不相等的间接给他拿到新的数组外面存起来。遍历完间接新数组就是答案。
看样子是很靠近了哈!毕竟属于简略的题目。
然而, O(1) 额定空间的条件下实现这个是咱们跨不过来的坎。既然如此那就得思考在原数组上操作。
原数组上操作,先上双指针!
双指针
思路
快慢指针上场,快指针fast
,慢指针low
。
数组是有序的,那么反复的元素肯定会相邻。在同一个数组外面操作,也就是不反复的元素移到数组的左侧,最初取左侧的数组的值。
算法流程
比拟
fast
和low
地位的元素是否相等。循环执行:
- 如果相等,
fast
后移 1 位 - 如果不相等,将
low
前一位的值改为fast
,low
后移1位,fast
后移 1 位
- 如果相等,
循环完结:
fast
越界
- 循环完结,返回新数组长度
low + 1
图解
这将是最具备灵魂的一刻了。没有图解的算法都是耍流氓!(哈哈哈,我会尽量把我之前的流氓行为更正过去哈!)
其实画图花了我很多的工夫,但我感觉不亏,记得更粗浅!
来个GIF吧!(用Python写了一个将图片生成GIF的小工具)
JavaScript
没有什么特地好说的,强行来一句的话,就是把nums
的长度计算拿上去,节约老本。
代码
/** * @param {number[]} nums * @return {number} */var removeDuplicates = function(nums) { // 判断边界 if (nums && nums.length < 0) { return 0 } var low = 0, fast = 1, n = nums.length; while (fast < n) { if (nums[fast] !== nums[low]) { nums[low + 1] = nums[fast] low++ } fast++ } return low + 1};
Java
代码
class Solution { public int removeDuplicates(int[] nums) { if (nums == null || nums.length < 1) { return 0; } int fast = 1, low = 0, n = nums.length; while(fast < n) { if (nums[fast] != nums[low]){ nums[low + 1] = nums[fast]; low++; } fast++; } return low + 1; }}
Python3
代码
class Solution: def removeDuplicates(self, nums: List[int]) -> int: if not nums: return 0 n = len(nums) fast = 1 low = 0 while fast < n: if nums[fast] != nums[low]: nums[low + 1] = nums[fast] low += 1 fast += 1 return low + 1
PHP
代码
class Solution { /** * @param Integer[] $nums * @return Integer */ function removeDuplicates(&$nums) { if ($nums == null || count($nums) < 0) { return 0; } $fast = 1; $low = 0; $n = count($nums); while ($fast < $n) { if ($nums[$fast] != $nums[$low]) { $nums[$low + 1] = $nums[$fast]; $low++; } $fast++; } return $low + 1; }}
Go
留神go语言是没有while的
代码
func removeDuplicates(nums []int) int { n := len(nums) if n < 1 { return 0 } low := 0 for fast := 1; fast < n; fast++ { if nums[fast] != nums[low] { nums[low + 1] = nums[fast] low++ } } return low + 1}
C++
代码
class Solution {public: int removeDuplicates(vector<int>& nums) { int n = nums.size(); if (n < 1) { return 0; } int fast = 1, low = 0; while (fast < n) { if (nums[fast] != nums[low]) { nums[low + 1] = nums[fast]; low++; } fast++; } return low + 1; }};
C
代码
int removeDuplicates(int* nums, int numsSize){ if(numsSize == 0) { return 0; } int fast = 1, low = 0; while (fast < numsSize) { if (nums[fast] != nums[low]) { nums[low + 1] = nums[fast]; low++; } fast++; } return low + 1;}
总结
从数组开始,思考 数组提该如何提炼思路,从简略到简单一步一步拆解,也将编程语言的数据应用技能晋升。