难度:中等
题目要求:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
示例2
输入:nums = [1]
输出:1
示例3
输入:nums = [5,4,-1,7,8]
输出:23
题解:
直接是用动态规划,规划方程如下:
- f(i) = max{f(i - 1) + nums[i], nums[i]}
想法代码
public class Solution
{
public static void Main(string[] args)
{
int[] nums = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
Solution solution = new Solution();
int res = solution.MaxSubArray(nums);
Console.WriteLine(res);
}
public int MaxSubArray(int[] nums)
{
int pre = 0, maxAns = nums[0];
foreach (int x in nums)
{
pre = Math.Max(pre + x, x);
maxAns = Math.Max(maxAns, pre);
}
return maxAns;
}
}
难度:中等
题目要求:
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例2
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
题解
直接按层遍历,可以忽略记录每个元素是否被访问
具体步骤如下:
- 对于 m ∗ n m * n m∗n 的矩阵 m a t r i x matrix matrix,定义矩阵的待遍历部分的上边界、下边界、左边界和右边界分别为 t o p , b o t t o m , l e f t , r i g h t top,bottom,left,right top,bottom,left,right,初始时 t o p = 0 , b o t t o m = m − 1 , l e f t = 0 , l e f t = 0 , r i g h t = n − 1 top=0,bottom=m-1,left=0,left=0,right=n-1 top=0,bottom=m−1,left=0,left=0,right=n−1。每一层遍历方法如下:
- 对于 c o l col col 从 l e f t left left 到 r i g h t right right,依次遍历 m a t r i x [ t o p ] [ c o l ] matrix[top][col] matrix[top][col],然后将 t o p top top 的值加
1
- 对于 r o w row row 从 t o p top top 到 b o t t o m bottom bottom,依次遍历 m a t r i x [ r o w ] [ r i g h t ] matrix[row][right] matrix[row][right],然后将 r i g h t right right 的值减
1
- 对于 c o l col col 从 r i g h t right right 到 l e f t left left,依次遍历 m a t r i x [ b o t t o m ] [ c o l matrix[bottom][col matrix[bottom][col,然后将 c o l col col 的值减
1
- 对于 r o w row row 从 b o t t o m bottom bottom 到 t o p top top,依次遍历 m a t r i x [ r o w ] [ l e f t ] matrix[row][left] matrix[row][left],然后将 l e f t left left 的值加
1
每次遍历一层之后,四个边界都向中间移动一步。当遍历的元素个数等于 m × n m×n m×n 时,矩阵中的所有元素遍历结束。
想法代码
public class Solution
{
public static void Main(string[] args)
{
int[][] matrix =
{
new int[] { 1, 2, 3, 4 },
new int[] { 5, 6, 7, 8 },
new int[] { 9, 10, 11, 12 }
};
Solution solution = new Solution();
IList res = solution.SpiralOrder(matrix);
foreach (var a in res)
{
Console.Write(a + " ");
}
}
public IList SpiralOrder(int[][] matrix)
{
IList order = new List();
int m = matrix.Length, n = matrix[0].Length;
int remain = m * n;
int top = 0, bottom = m - 1, left = 0, right = n - 1;
while (remain > 0)
{
for (int col = left; col <= right && remain > 0; col++)
{
order.Add(matrix[top][col]);
remain--;
}
top++;
for (int row = top; row <= bottom && remain > 0; row++)
{
order.Add(matrix[row][right]);
remain--;
}
right--;
for (int col = right; col >= left && remain > 0; col--)
{
order.Add(matrix[bottom][col]);
remain--;
}
bottom--;
for (int row = bottom; row >= top && remain > 0; row--)
{
order.Add(matrix[row][left]);
remain--;
}
left++;
}
return order;
}
}