T1子串暴力遍历
5299. 找到一个数字的 K 美丽值
题目:
思路
一看数据量 num < 109 相当于字符串长度最长为10。直接暴力穷举所有长度为k的子串。然后转成数字尝试整除num即可
java代码
public int divisorSubstrings(int num, int k) {
int ret = 0;
String s = String.valueOf(num);
for (int i = 0; i <= s.length() - k; i++) {
String tem = s.substring(i, i + k);
int cur = Integer.parseInt(tem);
if(cur != 0 && num % cur == 0) ret++;
}
return ret;
}
T2前缀和
6067. 分割数组的方案数
题目
思路
数据量105 , 所有最多O(n)时间复杂度。 O(n)保存前缀、后缀和,一次遍历直接获取前 i + 1 个元素和 和 剩余元素和,然后比较累加即可。 注意: 凡是遇到反复加和或相乘的,必须用long来存储,否则很容易溢出。
Java代码
public int waysToSplitArray(int[] nums) {
int n = nums.length;
long[] preSum = new long[n];
long[] offSum = new long[n];
long pre = 0, off = 0;
for (int i = 0; i < nums.length; i++) {
pre += nums[i];
preSum[i] = pre;
offSum[n - i - 1] = off;
off += nums[n - i - 1];
}
int ret = 0;
for (int i = 0; i < n - 1; i++) {
if(preSum[i] < offSum[i]) ret++;
}
return n - 1 - ret;
}
T3 区间的滑动窗口
6068. 毯子覆盖的最多白色砖块数
题目
思路
周赛没做出来,饶了很久怎么写都不对,5555, 学习大佬方法。发现是滑动窗口,我会滑动窗口,但是没有做过这种区间的滑动窗口。一定要多见各种题型
数据量是 5 * 104 , 时间复杂度不能超过O(nlogn) 先给区间二维数组排个序O(nlogn)。 以每个区间为开头,找到最多覆盖的瓷砖数。返回最大的即可。 最多覆盖的瓷砖数可以由能完全覆盖的区间 + 最后不完全覆盖的区间得一部分。 能完全覆盖得区间和之和起始位置由关, 避免反复计算,引入前缀和思想
代码
public int maximumWhiteTiles(int[][] tiles, int carpetLen) {
Arrays.sort(tiles, (q, w) -> q[0] - w[0]);
int n = tiles.length;
long ret = 0;
long preSum = 0, curSum = 0;
int r = 0;
for (int i = 0; i < n; i++) {
while (r < n && tiles[r][1] - tiles[i][0] + 1 <= carpetLen) {
curSum += tiles[r][1] - tiles[r][0] + 1;
r++;
}
if(r == n) {
ret = Math.max(ret, curSum - preSum);
}else {
ret = Math.max(ret, curSum - preSum + Math.max(0, tiles[i][0] + carpetLen - tiles[r][0]));
}
preSum += tiles[i][1] - tiles[i][0] + 1;
}
return (int)ret;
}
T4
暂时不追求,只求A3题
|