题目
3.绝对差不超过限制的最长连续子数组
- 有序矩阵中的第 k 个最小数组和
思路与算法
- 第三题,本题没什么特殊的东西,滑动窗口即可,注意书写即可。
- 第四题,由于给的数据比较小,k<=200,因此我们尝试一行一行的更新res的值,res中存放当前几行数据两两枚举后的和的排序之后的值,over。
代码实现
3.绝对差不超过限制的最长连续子数组
class Solution {
public int longestSubarray(int[] nums, int limit) {
// 窗口左端l
int l = 0;
int res = 0;
if (nums.length == 1) {
return 1;
}
// i为右边界,j从有边界-1开始向左遍历,处理
for (int i = 1; i < nums.length; i++) {
for (int j = i - 1;j >= l; j--) {
// 如果这俩值相等,则不需要处理,直接扩大窗口
if (nums[i] == nums[j]) {
break;
}
// 否则需要更新l的值
if (Math.abs(nums[i] - nums[j]) > limit) {
l = j + 1;
break;
}
}
res = Math.max(res,i - l + 1);
}
return res;
}
- 有序矩阵中的第 k 个最小数组和
class Solution {
public int kthSmallest(int[][] mat, int k) {
// 获取行列
int m = mat.length;
int n = mat[0].length;
// 新建长度为k的list
List<Integer> res = new ArrayList<>(k);
// 把第一行的数添加到res先
for (int i = 0; i < n; i++) {
res.add(mat[0][i]);
}
/* 每次加入一行,将这一行和初始res中的第一行的值进行逐个相加求和再排序,直到最后一行加入的 时候,我们只需要排序拿到第k个值即可。*/
for (int i = 1; i < m; i++) {
List<Integer> newList = new ArrayList<>();
for (int oldList : res) {
for (int num : mat[i]) {
newList.add(oldList + num);
}
}
Collections.sort(newList);
// 记得清空res每次
res.clear();
int len = Math.min(k,newList.size());
for (int j = 0;j < len;j++) {
res.add(newList.get(j));
}
}
return res.get(k-1);
}
}