1、有序数组的平方
这道题主要是要理解双指针的思想,主要是确定一个思路:在这个递增序列的数组中,要考虑到平方之后,只有两边的值是最大的,不管是负数边还是正数边,所以可以使用双指针,一个头一个尾,比较两者平方的大小,依次向下比较
这道题还有一个点是java的数组创建,int[] index = new int[nums.length];这表示创建一个数组index,其长度和nums的数组长度相同
class solution{
public int[] sortedSquares(int[] nums){
int left = 0;
int right = nums.length - 1;
int[] index = new int[nums.length];
int a = nums.length - 1;
while(left <= right)
{
if(nums[left]*nums[left] < numms[right]*nums[right])
{
index[a--] = nums[right]*nums[right];
--right;
}
else{
index[a--] = nums[left]*nums[left];
++left;
}
}
return index;
}
2、长度最小的子数组
这道题主要掌握一个滑动窗口的使用,并且这个应用场景适合滑动窗口,滑动窗口创建是通过在for循环内部while循环sum -=nums[i++];这就同时做到了双值变更,所以很精妙,这句代码,具体代码如下:
class solution{
public int minSubArrayLength(int target,int[] nums){
int i = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int j = 0;j<nums.length;j++)
{
sum += nums[j];
while(sum >= target)
{
result = Math.min(result,j-i+1);
sum -= nums[i++];
}
}
return result == Integer.MAX_VALUE?0:result;
}
3、螺旋矩阵II
这道题的关键思想在于你比如说给了n=5,那么他的循环次数就是while(loop<2),5/2=2,循环次数loop取得是n/2,外层一次循环就是四个过程,左到右,上到下,右到左,下到上,然后每次循环到末尾时,这些i和j都是停留在那里了,是个定值,下一个for又可以使用,相当于位置和值一直给下边for输送,恰恰值也是这样传递下去的
最后还得判断一下n是否是奇数,因为以上每次四次for都是在填每一层的循环,是一个完整的层次,所以在n为奇数的时候就是中间的值得单独设定,否则中间的值是空的,最后打印出来也就是默认值0;
代码如下:
class solution{
public int[][] generateMatrix(int n)
{
int start = 0; //每次填充的开始位置res[start][start]
int loop = 0; //循环的次数
int num = 1;
int[][] res = new int[n][n];
int i,j;
while(loop < n/2)
{
for(j=start;j<n-loop;j++) //for循环的条件得注意一下,前两次是增加所以是小
于n-loop
{
res[start][j] = num++;
}
for(i = start;i<n-loop;i++)
{
res[i][j] = num++; //j,num的值接上的for,加到多少就还是多少
}
for(;j>=loop;j--) //后两次的for循环条件得注意,是大于等于loop的
{
res[i][j] = num++;
}
for(;i>=loop;i--)
{
res[i][j] = num++;
}
start++;
}
if(n%2 == 1)
{
res[start][start] = num;
}
}
}