977.有序数组的平方
题目连接:link
我的思路
看到题目第一眼那就是暴力做,纯纯的暴力,直接先全部先平方然后用Java自带的排序进行排序,这就结束了。
代码
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i=0;i<nums.length;i++){
//对数组中的每个数进行平方
nums[i]=(int)Math.pow(nums[i],2);
}
//从小到大排序
Arrays.sort(nums);
return nums;
}
}
学到的新想法
既然是学习,那当然是不能就这样结束了,看了资料和视频后,了解到可以双指针的做法来考虑,首先先看题目,给我们的数组本身是经过排序的,只不过其中有负数,会出现负数平方后比正数的平方要大的情况,那么我们只要比较负数的平方和正数的平方谁大就好了。这个时候我们需要两个指针,一个指向数组头部,一个指向数组尾部,平方后比较,把大的放大新数组的尾部即可。
代码
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
// 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
result[index--] = nums[left] * nums[left];
++left;
} else {
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
}
}
209.长度最小的子数组
我的思路
第一眼看到这题还是暴力的做法,也没有什么想法就暴力从第一个往后加,加到比target大或者相等,然后记录下来,接着从第二个开始往后加,以此类推,最后自然而然的时间超限了,想了半天也没有什么想法,看了讲解后,感觉和毛毛虫很像,用滑动窗口来做,这里的滑动窗口是指加过数就不再重新加了,动态调整字串,我感觉是不是数据有负数,这个做法也是可以实现的?
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0,i=0,j=0,tag=0,ans=1000000,result=0;
for(j=0;j<nums.length;j++){
sum+=nums[j];
if(sum>=target){
while(sum-nums[i]>=target){
sum-=nums[i++];
}
result=j-i+1;
ans=Math.min(result,ans);
}
}
if(ans!=1000000)
return ans;
else return 0;
}
}
59.螺旋矩阵II
我的思路
这到题,看到就是模拟,也不想去找什么规律,单纯的模拟,根据现实的做法,分为4个方向,向左,向下,想右,最后向上,然后不断的循环这四个方向,主要还是对限制条件的判断需要想想。
代码
代码写的比较冗长啊,对边界直接就通过有没有填过数来判断了,也不管什么左闭右开的。
class Solution {
public int[][] generateMatrix(int n) {
int ans[][]=new int[n][n];
int i=0,j=0,index=1;
while(index<=n*n){
while(j<n &&ans[i][j]==0)
{
ans[i][j]=index++;
j++;
}
j--;
i++;
while(i<n&&ans[i][j]==0){
ans[i][j]=index++;
i++;
}
i--;
j--;
while(j>=0&&ans[i][j]==0){
ans[i][j]=index++;
j--;
}
j++;
i--;
while(i>=0&&ans[i][j]==0){
ans[i][j]=index++;
i--;
}
i++;
j++;
}
return ans;
}
}