【LeetCode-面试经典150题-day2】

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

时间: 击败了100%

内存: 击败了52.10%

class Solution {
    public int removeDuplicates(int[] nums) {
        //官方提供的参考代码,学习使用
        if(nums.length <= 2)
            return nums.length;
        
        int i=2,j=2;
        while(i

时间: 击败了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

时间: 击败了99.62%

内存: 击败了28.49%

这内存,麻了

学习笔记:

1. ++i和i++的差距

  • 前缀自增++i,从内存中加载i,把它加1,使用后再返回到内存中;本质时变量本身+1返回。
  • 后缀自增i++,从内存中加载i,使用,把它加1,再存到内存中。 本质是创建一个新变量,得到原有变量之后加1返回,所以在LeetCode编译过程中,使用++i所占内存要比使用i++少一点点(程序量不大,所以只是微小的变化)。

你可能感兴趣的:(LeetCode,算法,leetcode,java)