leedcode-高频

1. 字典序的第k小数字(leedcode - 440)

分析(p当前位置):

  • 指定前缀下的节点个数
  • 如果第k个数字在当前前缀下,进一步寻找:pre *= 10, p++
  • 如果第k个数字不在当前前缀下:pre ++, p += count

2. 寻找重复数(leedcode - 287)

  • 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
  1. 假设 nums 只有一个重复的整数 ,找出这个重复的数
  • 方法一:Hashmap
  • 方法二:原地归位(时间复杂度:O(n) ;空间复杂度:O(1))
  • 方法三:二分法(时间复杂度:O(logn) ;空间复杂度:O(1) 同时不改动原数组)(基本思想:对于区间[1, 7],取mid = 4,遍历数组,当数组中小于等于4的个数 大于 4时,有重复)
  1. 假设 nums 不仅仅有一个重复的整数,找出重复次数最多的数字(多个时取最大)
    /*
    * 时间复杂度:O(n) 空间复杂度:O(1)
    * 数组长度:n
    * 数组元素:0 < m < n < 50000
    * k: 数组中的最大元素 + 1
    * */
    public int maxRepeatNum(int[] nums, int k){

        for(int i = 0; i < nums.length; i++){
            nums[nums[i] % k] += k;
        }

        int res = -1, maxCount = 0;
        for(int i = 0; i < nums.length; i++){
            if(maxCount <= (nums[i] / k)){
                res = i;
                maxCount = nums[i] / k;
            }
        }
        System.out.println(Arrays.toString(nums));
        return res;
    }

3. 多数之和

  1. 两数之和
  • 方法一:排序,使用左右指针
  • 方法二:借助hash表,key-数据,value-下标,依次遍历,判断hash表中是否存在target-当前值
  1. 三数之和
  • 排序,三指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值