977.有序数组的平方
思路:直接用双指针法解决,把平方后的元素再替换进数组中,之后利用数组sort排序再输出数组
C#代码:
public class Solution {
public int[] SortedSquares(int[] nums) {
int m = 0;
for(int k = 0;k < nums.Length;k++){
nums[m] = nums[k]*nums[k];
m++;
}
Array.Sort(nums);
return nums;
}
}
209.长度最小的子数组
思路:双指针的方法,快指针循环直到sum>=target,再对快慢指针包括的数组的长度比较,比较后减去慢指针i所属的元素,再i++。结束一遍循环后再判断sum是否大于等于target,是就继续减去慢指针,再i++,否则再for循环一遍,快指针往后移动,直到sum>=target或者到达数组的长度。所有循环完成后,判断一遍最小长度的值后就输出。
C#代码:
public class Solution {
public int MinSubArrayLen(int target, int[] nums) {
int i=0,miniLen = int.MaxValue;
int sum = 0;
for(int j=0;j<nums.Length;j++){
sum += nums[j];
while(sum >= target){
miniLen = Math.Min(j-i+1,miniLen);
sum -= nums[i];
i++;
}
}
return miniLen == int.MaxValue?0:miniLen;
}
}
59.螺旋矩阵II
思路:只要能明白螺旋过程出现拐角前一直保持行(列)不变,拐弯后就保持列(行)不变就能解决。还有注意用的方法是二分法中的左闭右开的方法。(左闭右闭还没研究怎么实现,但左闭右开的方法应该比较容易理解和写出的)
C#代码:
public class Solution {
public int[][] GenerateMatrix(int n) {
int[][] a = new int[n][];
for(int i=0;i<n;i++){
a[i] = new int[n];
}
int count =1;
int x = n-1,y = 0;
while(count < n*n){
for(int i=y;i<x;i++){a[y][i] = count++;}
for(int i=y;i<x;i++){a[i][x] = count++;}
for(int i=x;i>y;i--){a[x][i] = count++;}
for(int i=x;i>y;i--){a[i][y] = count++;}
y++;
x--;
}
if(n%2==1){a[n/2][n/2] = count;}
return a;
}
}
思路:
public class Solution {
public IList<int> SpiralOrder(int[][] matrix) {
IList<int> order = new List<int>();
int X = matrix.Length;
int Y = matrix[0].Length;
int sum = X * Y;
int count = 1;
//上边界、下边界、左边界、右边界
int top = 0,bottom = X - 1, left = 0,right = Y - 1;
while (0 < sum)
{
for(int col = left; col <= right && sum > 0;col++){
order.Add(matrix[top][col]);
sum--;
}
top++;
for(int row = top; row <= bottom && sum > 0; row++){
order.Add(matrix[row][right]);
sum--;
}
right--;
for(int col = right;col >= left && sum > 0;col--){
order.Add(matrix[bottom][col]);
sum--;
}
bottom--;
for(int row = bottom;row >= top && sum > 0;row--){
order.Add(matrix[row][left]);
sum--;
}
left++;
}
return order;
}
}
总结:前两道题看一下视频知道是用双指针后很容易就解决,不过这第三道螺旋矩阵看视频一时间没想起来,后面多画几张图之后才明白是怎样的一个思路。