【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<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++少一点点(程序量不大,所以只是微小的变化)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问。 4. 查找特殊字符:如果乱码问只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值