LeetCode 977.有序数组的平方
题目链接:有序数组的平方
文档讲解:代码随想录
核心思想:暴力排序法||双指针法
暴力排序
简单粗暴-先循环赋值在调用系统API排序
public int[] sortedSquares(int[] nums) {
for(int i=0;i<nums.length;i++){
nums[i]=Math.abs(nums[i])*Math.abs(nums[i]);
}
Arrays.sort(nums);
return nums;
}
双指针
题目中数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间,所以可以考虑用两个指针 一个在前一个在后 比较平方后的大小 用一个新数组倒序放入较大的值
public int[] sortedSquares(int[] nums) {
int res[] = new int[nums.length];
int k = nums.length - 1;
for (int i = 0, j = nums.length - 1; i <= j;) {
if (nums[i] * nums[i] < nums[j] * nums[j]) {
res[k--] = nums[j]*nums[j];
j--;
} else {
res[k--] = nums[i]*nums[i];
i++;
}
}
return res;
}
LeetCode 977.长度最小的子数组
题目链接:长度最小的子数组
文档讲解:代码随想录
核心思想:滑动窗口
滑动窗口
根据目标值,动态调节子序列的开始节点和结束节点位置。
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引
public int minSubArrayLen(int target, int[] nums) {
//滑动窗口法
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum=sum+nums[right];
while(sum>=target){
result=Math.min(result,right-left+1);
sum-=nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
LeetCode 59.螺旋矩阵II
题目链接:长度最小的子数组
文档讲解:代码随想录
核心思想:重点在于控制方向和坚持一种开闭原则
public int[][] generateMatrix(int n) {
int left = 0, right = n-1, up = 0, down = n-1;
int dir = 0; // 0 左->右 1 上->下 2 右->左 3 左->右
int[][] res = new int[n][n];
int num = 1;
while (num <= n * n) {
if (dir == 0) {
for (int j = left; j <= right; j++) {
res[up][j] = num++;
}
up++;
dir = 1;
}
if (dir == 1) {
for (int j = up; j <= down; j++) {
res[j][right] = num++;
}
right--;
dir = 2;
}
if (dir == 2) {
for (int j = right; j >= left; j--) {
res[down][j] = num++;
}
down--;
dir = 3;
}
if (dir == 3) {
for (int j = down; j >= up; j--) {
res[j][left] = num++;
}
left++;
dir = 0;
}
}
return res;
}