977. 有序数组的平方
思路: 双指针法。
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
public static int[] SortedSquares(int[] nums)
{
List<int> result = new List<int>(); //c#中 new int[] 时得知道constant的数组长度,不然就用List<int>
int left = 0;
int right = nums.Length - 1;
while (left <= right)
{
int leftSquare = nums[left] * nums[left];
int rightSquare = nums[right] * nums[right];
if (leftSquare < rightSquare)
{
result.Add(rightSquare);
right--;
}
else {
result.Add(leftSquare);
left++;
}
}
result.Reverse();
return result.ToArray();
}
- 时间复杂度为O(n)
209.长度最小的子数组
法一: 暴力解法
public static int MinSubArrayLen(int target, int[] nums)
{
//Brute force
int sum = 0;
int result = int.MaxValue;
for (int i = 0; i < nums.Length; i++)
{
sum = 0;
for (int j = i; j < nums.Length; j++)
{
sum += nums[j];
if (sum >= target)
{
result = result > j - i + 1 ? j - i + 1 : result;
break;
}
}
}
return result != int.MaxValue ? result : 0;
}
- 时间复杂度为O(n^2)
- 空间复杂度O(1)
法二: 滑动窗口法
滑动窗口里的内容 是和大于等于≥目标值,
终止位置用for循环,
起始位置的移动是 确保窗口内容大于等于目标值后,往后挪一位。
public static int MinSubArrayLen(int target, int[] nums)
{
//
int sum = 0;
int result = int.MaxValue;
int i = 0;
for (int j = 0; j < nums.Length; j++)
{
sum += nums[j];
while (sum >= target)
{
result = result > j - i + 1 ? j - i + 1 : result;
sum -= nums[i++];
}
}
return result != int.MaxValue ? result : 0;
}
- 时间复杂度为O(n)
- 空间复杂度O(1)
59.螺旋矩阵II
public static int[][] GenerateMatrix(int n)
{
int[][] data = new int[n][];
for (int i = 0; i < n; i++)
{
data[i] = new int[n];//分配空间
}
int value = 1;
int start = 0;
int end = n-1; //每轮固定的start, end
while (value < n * n) {
for (int j = start; j < end; j++)
{
data[start][j] = value++;
}
for (int i = start; i < end; i++)
{
data[i][end] = value++;
}
for (int j = end; j > start; j--)
{
data[end][j] = value++;
}
for (int i = end; i > start; i--)
{
data[i][start] = value++;
}
start++;
end--;
}
if (n % 2 == 1) data[n / 2][n / 2] = n * n;
return data;
}