力扣周赛

//1984. 学生分数的最小差值
public int minimumDifference(int[] nums, int k) {
    int i = 0, j = k - 1;
    Arrays.sort(nums);//排序后[i...i+k]段的首位两个数便是最小值和最大值
    int res = 100_005;
    while (j < nums.length) {
        res = Math.min(res, nums[j++] - nums[i++]);
    }
    return res;
}

//1985. 找出数组中的第 K 大整数
public String kthLargestNumber(String[] nums, int k) {
    //按字典序的数字从大到小排列,返回k-1个数,即k大的数
    Arrays.sort(nums, ((o1, o2) -> {
        if (o1.length() > o2.length()) return -1;
        else if (o1.length() < o2.length()) return 1;
        return o2.compareTo(o1);
    }));
    return nums[k - 1];
}

方法1:朴素版递归

方法2:记忆化递归

  • 另外一种写法

方法3:状压DP

  • 枚举子集

  • 状压dp

  • 多维背包

方法1:开数组统计

  • 统计每个大小写字符出现的次数,从Z往后到A遍历,找到同时出现了大小写字符的字符,返回

方法2:位运算

  • A为65,a为97,z为122,只需要58位即可存储 ,开个long类型的t,最大位位64位,将大写字符存在低32位,小写字符存在高32位,然后从Z到A开始倒序遍历,如果当前位(大写)出现的次数大于等于1,当前位+32移位到当前字符的小写字符上,如果出现的次数大于等于1,返回该字符

方法1:数学朴素版

设任意一个数x=10*a+b*k,这个数满足了个位数是k的条件,如果num可以拆解成这若干个x,将这若干个x加起来,得到的结果一样满足10*m+n*k=num 可以得到 (num-n*k)%10 =0,要求的是小的n

方法2:同余优化版

(n*k )%10 拆解成n%10 * k%10 ,当n>=11的时候,效果和 1-10之间的数是一样的,这时候,n上界可以到10结束

方法1:位运算+贪心

  • 从后向前,所有的0都是加成,对结果构成正收益,1的话需要满足所构成的数t<=k,一旦到达这个数,1就不会被统计了

  • 数据溢出,需要考虑到

方法2:动态规划

方法1:动态规划

Last updated