977.有序数组的平方
题目链接:Loading Question... - 力扣(LeetCode)
本体的解题思路是:采用双指针法,从后向前更新结果数组
以下是两种不同的写法:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];
int left = 0;
int right = nums.length - 1;
int ai = right;
int n;
for (int i = 0; i < nums.length; i++){
nums[i] = (int)Math.pow(nums[i],2);
}
// for (int x : nums){
// x = (int)Math.pow(x,2);
// }
while(left <= right){
if(nums[left]< nums[right]){
result[ai--] = nums[right--];
}else{
result[ai--] = nums[left++];
}
}
return result;
}
}
主要是想记录一下,上述代码中普通for循环和增强for循环的差别:
for (int i = 0; i < nums.length; i++){
nums[i] = (int)Math.pow(nums[i],2);
}
// for (int x : nums){
// x = (int)Math.pow(x,2);
// }
在本题目中,普通for循环就可以正确AC,而增强for循环不可以。原因在于,上例中,增强for循环中的x并不是数组中对应元素的引用,而只是和数组中元素值相等的变量值。所以基本数据类型在用增强for循环进行循环操作修改时,修改会失效。
参考博文:(103条消息) java普通for循环与增强for循环差别_HiBOYOO的博客-CSDN博客
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans = new int[nums.length];
int left = 0, right = nums.length - 1;
int i = nums.length - 1;
while(left <= right){
if(Math.pow(nums[left],2) <= Math.pow(nums[right],2)){
ans[i--] = (int)Math.pow(nums[right--],2);
}
else{
ans[i--] = (int)Math.pow(nums[left++],2);
}
}
return ans;
}
}
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
这个题目是滑动窗口的典型题目,通过左右指针维护一个虚拟的窗口,使得窗口中得数值满足某种条件。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 滑动窗口,通过左右指针,维护一个窗口,该窗口中的target值始终大于7
int left = 0, right = 0;
int n = nums.length;
int sum = 0;
int min = Integer.MAX_VALUE;
while(right < n && sum < target){
sum += nums[right++];
}
if(right == n && sum < target) return 0;
while(right <= n){ // 此处应该考虑得是循环结束得条件,而不是陷入到逻辑当中,当右指针走到最后一个元素的下下个元素时,循环就已经可以结束了。
if(sum >= target){
min = min > right - left ? right -left : min;
sum -= nums[left++];
}
else{
if(right < n) sum += nums[right];
right++;
}
}
return min;
}
}
59.螺旋矩阵
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
解题思路:不要陷入到题目中,想着如何一圈一圈的模拟循环,这样是写不出来的,因为边界条件一直在变,我们要维护不变的量, 只要抓住维护边界条件这个思路,这个题就不难了。代码如下:
class Solution {
public int[][] generateMatrix(int n) {
// 维护边界进行循环,切记陷入题目当中,去一步步模拟
int l = 0, r = n - 1, u = 0, d = n - 1;
int j = 1;
int[][] ans = new int[n][n];
int time = (int)Math.pow(n,2);
while(j <= time){
for(int i = l; i <= r; i++){
ans[u][i] = j++;
}
u++;
for(int i = u; i <= d; i++){
ans[i][r] = j++;
}
r--;
for(int i = r; i >= l; i--){
ans[d][i] = j++;
}
d--;
for(int i = d; i >= u; i--){
ans[i][l] = j++;
}
l++;
}
return ans;
}
}
\