977. 这题很简单上来直接每个元素原地算平方然后sort简单又粗暴,很显然效率不是很高。然后使用双指针思想,原数组是有序的但是因为有负数的存在,平方过后可能会变大,因此用双向指针(最大值肯定是两端的其中一个)。两端的值平方过后进行比大小,创建一个新的result数组,然后将较大的那个数字放到新数组的末端(从尾到头开始放),然后移动指针。这题主要考的就是一个思路问题,思路有了也就没什么问题了(空间换时间)。
209. 数组经典之滑动窗口!!!这题之前做过已经忘记思路了,看了题解才想起来滑动窗口这个操作。其精髓就在于一个for循环里面镶嵌一个while循环,但凡记住这个模版或者说套路,后面的类似题目都应该算是比较好解的。当前n个和大于等于target的时候移动left指针(这里特别要注意移动left指针前一定要确保当前的sum值要减去nums[left]的值),然后for循环继续移动right指针继续求sum。注意:最后return的时候还是要和Integer.MAX_VALUE进行比较,如果ans的值没变还是Integer.MAX_VALUE说明while循环的条件一直没被满足,也就是sum>=target的这个条件一直没达到,这个情况下就要return 0,反之则return (right - left) + 1 ,下标运算最后结果要+1才行。
public int minSubArrayLen(int target, int[] nums) {
int left =0;
int ans=Integer.MAX_VALUE;
int sum = 0;
for(int right=0; right<nums.length; right++){
sum += nums[right];
while(sum >= target){
ans = ans < (right - left)+1 ? ans : (right - left)+1;
sum -= nums[left];
left++;
}
}
// 这里要注意还是和Integer.MAX_VALUE比较,看看有没有发生变化
return ans == Integer.MAX_VALUE ? 0 : ans;
}
59. 这题属于模拟题目,不算是算法题目,但是朕实在是学不明白,尔等且先退下,等我下次再来看。(这里贴一段代码先,不是carl的,leetcode大神的感觉他这个更好理解点似乎)
class Solution {
public int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] mat = new int[n][n];
int num = 1, tar = n * n;
while(num <= tar){
for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
t++;
for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
r--;
for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
b--;
for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
l++;
}
return mat;
}
}
/**
作者:Krahets
这段代码是一个Java解决方案,用于生成一个n阶方阵,其中方阵元素按照从1到n*n的顺序逆时针螺旋排列。
解决方案首先初始化了左边界l、右边界r、顶部边界t、底部边界b,并创建了一个n*n大小的二维数组mat用于存储结果。
(当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
1.执行 num += 1:得到下一个需要填入的数字;
2.更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1)
然后在一个while循环中,通过四个for循环不断填充矩阵mat。具体来说:
- 第一个for循环从左到右填充上边界,填充完成后上边界向下移动一行( t += 1)。
- 第二个for循环从上到下填充右边界,填充完成后右边界向左移动一列。
- 第三个for循环从右到左填充下边界,填充完成后下边界向上移动一行。
- 第四个for循环从下到上填充左边界,填充完成后左边界向右移动一列。
循环直到填充完所有元素为止,然后返回生成的矩阵mat。
使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
整体来说,这段代码实现了一个逆时针螺旋填充矩阵的功能,通过不断更新边界和填充矩阵元素来完成任务。
*/