力扣周赛
//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:动态规划
T4.5254. 卖木头块
方法1:动态规划
Last updated