做cpa项目用什么网站加强网站备案管理专项行动
做cpa项目用什么网站,加强网站备案管理专项行动,怎么建立图片的网站吗,网站设计的建设目的优质博文#xff1a;IT-BLOG-CN 一、题目
给你一个有序数组nums#xff0c;请你原地删除重复出现的元素#xff0c;使得出现次数超过两次的元素只出现两次 #xff0c;返回删除后数组的新长度。不要使用额外的数组空间#xff0c;你必须在原地修改输入数组并在使用O(1)额… 优质博文IT-BLOG-CN 一、题目
给你一个有序数组nums请你原地删除重复出现的元素使得出现次数超过两次的元素只出现两次 返回删除后数组的新长度。不要使用额外的数组空间你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。
说明 为什么返回数值是整数但输出的答案是数组呢请注意输入数组是以「引用」方式传递的这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说不对实参做任何拷贝
int len removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i 0; i len; i) {print(nums[i]);
}示例 1 输入nums [1,1,1,2,2,3] 输出5, nums [1,1,2,2,3] 解释函数应返回新长度 length 5, 并且原数组的前五个元素被修改为1, 1, 2, 2, 3。不需要考虑数组中超出新长度后面的元素。
示例 2 输入nums [0,0,1,1,1,1,2,3,3] 输出7, nums [0,0,1,1,2,3,3] 解释函数应返回新长度length 7, 并且原数组的前五个元素被修改为0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。 1 nums.length 3 * 104 -104 nums[i] 104 nums已按升序排列 二、代码
思路 因为给定数组是有序的所以相同元素必然连续。我们可以使用双指针解决本题遍历数组检查每一个元素是否应该被保留如果应该被保留就将其移动到指定位置。具体地我们定义两个指针slow和fast分别为慢指针和快指针其中慢指针表示处理出的数组的长度快指针表示已经检查过的数组的长度即nums[fast]表示待检查的第一个元素nums[slow−2]为上上一个应该被保留的元素所移动到的指定位置。判断nums[slow−2]是否和当前待检查元素nums[fast]相同。当且仅当nums[slow−2]nums[fast]时当前待检查元素nums[fast]不应该被保留因为此时必然有nums[slow−2]nums[slow−1]nums[fast]。最后slow即为处理好的数组的长度。
特别地数组的前两个数必然可以被保留因此对于长度不超过2的数组我们无需进行任何处理对于长度超过2的数组我们直接将双指针的初始值设为2即可。
class Solution {public int removeDuplicates(int[] nums) {// 思路定义快慢两个指针fast slow 当 fast fast - 2 时替换掉当前元素if (nums.length 3) {return 2;}int slow 2, fast 2;while (fast nums.length) {// 这里需要用slow去-2if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return slow;}
}时间复杂度 O(n) 其中n是数组的长度。我们最多遍历该数组一次。 空间复杂度 O(1) 我们只需要常数的空间存储若干变量。
通用解法 为了让解法更具有一般性我们将原问题的「保留2位」修改为「保留k位」。
对于此类问题我们应该进行如下考虑 【1】由于是保留k个相同数字对于前k个数字我们可以直接保留 【2】对于后面的任意数字能够保留的前提是与当前写入的位置前面的第k个元素进行比较不相同则保留
举个例子我们令k2假设有如下样例[1,1,1,1,1,1,2,2,2,2,2,2,3] 【1】首先我们先让前2位直接保留得到1,1 【2】对后面的每一位进行继续遍历能够保留的前提是与当前位置的前面k个元素不同答案中的第一个1因此我们会跳过剩余的1将第一个2追加得到1,1,2 【3】继续这个过程这时候是和答案中的第2个1进行对比因此可以得到1,1,2,2 【4】这时候和答案中的第1个2比较只有与其不同的元素能追加到答案因此剩余的2被跳过3被追加到答案1,1,2,2,3
class Solution {public int removeDuplicates(int[] nums) { return process(nums, 2);}int process(int[] nums, int k) {int u 0; for (int x : nums) {if (u k || nums[u - k] ! x) nums[u] x;}return u;}
}时间复杂度 O(n) 空间复杂度 O(1)
splice直接删除 同删除有序数组中的重复项一题类似本题要求允许存在两个重复值那么只需要从索引值为2的地方开始遍历即可
当nums[i]nums[i-2]时说明有大于2个重复项那么利用splice删除当前索引下的数组值因为删除数组元素后数组长度发生改变所以需要i--回到当前索引位置继续检索否则会跳过一个未检索到的元素最后输出数组长度即可
/*** param {number[]} nums* return {number}*/
var removeDuplicates function (nums) {for (var i 2; i nums.length; i) {if (nums[i] nums[i - 2]) {nums.splice(i,1)i--} }return nums.length
};时间复杂度 O(n) 空间复杂度 O(n)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88262.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!