26.删除有序数组中的重复项
题意:
给你一个 升序排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
【输入样例】nums=[0,0,1,1,1,2,2,3,3,4]
【输出样例】5,nums=[0,1,2,3,4]
解题思路:
1.直接使用双指针,指针j指向“新”数组的下标,指针i遍历数组
2.根据是否相等进行赋值
3. 注意当nums[i]!=nums[j]时,证明一个新的元素被找到,要将其赋值给“新”数组时,要先将j进行++(挪位置),不然会覆盖掉原先的不重复元素。
class Solution {
public int removeDuplicates(int[] nums) {
int j = 0, i = 1;
//j指针存储的是唯一元素最终应该在的地方,i遍历数组
while(i < nums.length){
if(nums[i] == nums[j]){
i++;
}else{
nums[++j] = nums[i++];
}
}
//j是最后一个数组的指针,返回的是数组的长度,所以要+1
return j+1;
}
}
时间: 击败了100%
内存: 击败了73.91%
80. 删除有序数组中的重复项 II
题意:
给你一个有序数组
nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
【输入样例】nums=[1,1,1,2,2,3]
【输出样例】5,nums=[1,1,2,2,3]
解题思路:
1.直接定义一个count变量,统计同一元素出现多少次
2.因为双指针初始化指向不同,所以会先进行判断,根据比较结果赋值count的初始值为0或1
3.注意一定要判断数组的长度是否小于2,不然会报错;
class Solution {
public int removeDuplicates(int[] nums) {
if(nums.length <= 2)
return nums.length;
int i=1,j=0;
int count = 0;
if(nums[i] == nums[j]){
count = 1;
}
while(i<nums.length){
if(nums[i] != nums[j]){
nums[++j] = nums[i];
count=1;
}else if(count<2 && nums[i] ==nums[j]){
nums[++j] = nums[i];
count++;
}
i++;
}
return ++j;
}
}
时间: 击败了100%
内存: 击败了52.10%
class Solution {
public int removeDuplicates(int[] nums) {
//官方提供的参考代码,学习使用
if(nums.length <= 2)
return nums.length;
int i=2,j=2;
while(i<nums.length){
if(nums[j-2] != nums[i]){
nums[j] = nums[i];
++j;
}
++i;
}
return j;
}
}
时间: 击败了100%
内存: 击败了56.16%
内存使用比我自己的要好一点
169.多数元素
题意:
给定一个大小为
n
的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
【输入样例】nums=[3,2,2]
【输出样例】3
解题思路:
1.先排序
2.利用变量count统计同一元素出现的次数,定义变量maxCount存储当前出现次数最多的元素
3.遍历数组,遇到相同的+1,遇到不同的减-1,减到0重新开始计数
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
int maxCount = nums[0];//初始值为数组第一位
int i=0;
while(i<nums.length){
if(count==0) maxCount = nums[i];
count += (nums[i++] == maxCount) ? 1:-1;
}
return maxCount;
}
}
时间: 击败了99.62%
内存: 击败了28.49%
这内存,麻了
学习笔记:
1. ++i和i++的差距
- 前缀自增++i,从内存中加载i,把它加1,使用后再返回到内存中;本质时变量本身+1返回。
- 后缀自增i++,从内存中加载i,使用,把它加1,再存到内存中。 本质是创建一个新变量,得到原有变量之后加1返回,所以在LeetCode编译过程中,使用++i所占内存要比使用i++少一点点(程序量不大,所以只是微小的变化)。