算法进修Day-27

算法进修Day-27

53. 最大子数组和

难度:中等
题目要求:
给你一个整数数组 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;
    }
}

54. 螺旋矩阵

难度:中等
题目要求:
给你一个 mn 列的矩阵 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 mn 的矩阵 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=m1,left=0,left=0,right=n1。每一层遍历方法如下:
    • 对于 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;
    }
}

你可能感兴趣的:(算法进修,算法,leetcode,c#)