hot100 |十七、技巧

1-leetcode136. 只出现一次的数字

注意:√

  1. 确实是技巧题,看一眼知道技巧就很难忘记的那种
  2. 异或运算可以删去相同的数字,然后剩下只出现一次的结果
    public int singleNumber(int[] nums) {
        int n = nums.length;
        if (n == 1) {
            return nums[0];
        }
        
        int res = 0;
        for (int i = 0; i < n; i++) {
            res = res ^ nums[i];
        }
        return res;
    }

2-leetcode169. 多数元素

注意:√

  1. 传统办法肯定是用个字典啥的记录次数
  2. 排序的思想:如果这个众数是中间大小的数字,这个逻辑肯定没问题。极端一点,如果是最大或者最小的数,因为数字个数过半了,所以排序以后,正中间的元素也是这个元素,所以可以直接得到结果
  3. 第二种方式是眼中的数组只有target和非target,二者直接相消,最后剩下来的肯定是target
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
public int majorityElement1(int[] nums) {
        int target = 0;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (count == 0){
                target = nums[i];
                count = 1;
            }else if (nums[i] == target){
                count++;
            }else {
                count--;
            }
        }
        return target;
    }

3-leetcode75. 颜色分类

注意:×

  1. 这道题的trick我感觉在与指针回退for循环里面对于2类型进行了while循环操作,刚开始不理解,看了一些题解以后发现,如果我换回来的数字也是2,没有写while的情况下,当前这个数字就被略过了,也就是题解中的需要指针回退的问题
    public void sortColors(int[] nums) {
        int p0 = 0;
        int p1 = nums.length-1;
        for (int i = 0; i < nums.length; i++) {
            while (i<=p1 && nums[i]==2){
                int temp = nums[p1];
                nums[p1] = nums[i];
                nums[i] = temp;
                p1--;
            }
            if (nums[i] == 0){
                int temp = nums[p0];
                nums[p0] = nums[i];
                nums[i] = temp;
                p0++;
            }
        }
    }

4-leetcode31. 下一个排列

注意:×

  1. 错了很多遍,首先是思路的问题,如果看到这个题第一反应没思路,就去看题解
  2. 注意n的循环部分i>0如果按照传统的nums.forr i>=0在下面执行nums[i-1]的时候就会报错
  3. 注意如果最外面的for--n都跑完了,说明这个数组就是最大的数组的,就得返回最小的那个排列,放在最下面要执行一下Arrays.sort
  4. 最后要注意Arrays.sort(nums, i, n)经典左闭右开
    public void nextPermutation(int[] nums) {
        int n = nums.length;
        for (int i = n - 1; i > 0; i--) {
            if (nums[i] > nums[i - 1]) {
                Arrays.sort(nums, i, n);
                for (int j = i; j < n; j++) {
                    if (nums[j]>nums[i-1]){
                        int temp = nums[i-1];
                        nums[i-1] = nums[j];
                        nums[j] = temp;
                        return;
                    }
                }
            }
        }
        Arrays.sort(nums);
        return;
    }

5-leetcode287. 寻找重复数

注意:√

  1. 题解的思路很好,首先明确前提,整数的数组 nums 中的数字范围是 [1,n]
  2. 然后就是快慢指针判断是是否有环
    public int findDuplicate(int[] nums) {
        int slow = 0;
        int fast = 0;
        slow = nums[slow];
        fast = nums[nums[fast]];
        while (slow != fast){
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        int before = 0;
        int after = slow;
        while (before != after){
            before = nums[before];
            after = nums[after];
        }
        return before;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值