算法进修Day-30

算法进修Day-30

59. 螺旋矩阵II

难度:中等
题目要求:
给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例1

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例2

输入:n = 1
输出:[[1]]

题解

依据按层遍历的思想遍历矩阵

定义矩阵中的每个位置所在的层数为该位置到矩阵边界的最近距离,当遍历到第 k k k 层时,从 m a t r i x [ k ] [ k ] matrix[k][k] matrix[k][k] 开始按顺时针的顺序依次遍历第 k k k 层的全部位置

具体做法如下:

  • 对于 n ∗ n n*n nn 的矩阵 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 = n − 1 , l e f t = 0 , r i g h t = n − 1 top=0,bottom=n-1,left=0,right=n-1 top=0,bottom=n1,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] 并填入元素,并将 b o t t o m bottom bottom 的值减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

遍历结束之后,直接返回结果即可

想法代码

class Solution
{
    public static void Main(String[] args)
    {
        int n = 3;
        Solution solution = new Solution();
        int[][] res = solution.GenerateMatrix(n);
        foreach (var x in res)
        {
            foreach (var y in x)
            {
                Console.Write(y + " ");
            }
            Console.WriteLine();
        }
    }

    public int[][] GenerateMatrix(int n)
    {
        int[][] matrix = new int[n][];
        for (int i = 0; i < n; i++)
        {
            matrix[i] = new int[n];
        }
        int total = n * n;
        int num = 1;
        int top = 0, bottom = n - 1, left = 0, right = n - 1;
        while (num <= total)
        {
            for (int col = left; col <= right && num <= total; col++)
            {
                matrix[top][col] = num;
                num++;
            }
            top++;
            for (int row = top; row <= bottom && num <= total; row++)
            {
                matrix[row][right] = num;
                num++;
            }
            right--;
            for (int col = right; col >= left && num <= total; col--)
            {
                matrix[bottom][col] = num;
                num++;
            }
            bottom--;
            for (int row = bottom; row >= top && num <= total; row--)
            {
                matrix[row][left] = num;
                num++;
            }
            left++;
        }
        return matrix;
    }
}

60. 排列序列

难度:困难
题目要求:
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记。
给定 nk,返回第 k 个排列。

示例1

输入:n = 3, k = 3
输出:“213”

示例2

输入:n = 4, k = 9
输出:“2314”

示例3

输入:n = 3, k = 1
输出:“123”

题解

假设n=5,k=35, n为5的全排列就是首位为1-5的如下排列的所有1,2,3,4,5,每个各有24个排列,组成12345的全排列。由于k=35<48,也就是说第35个肯定在首位为2的全排列里边,所以第一个取2。 接下来就是考虑剩下1345这四个数的全排列里边取第k=35-24=11个,3,4,5,每个各有6个排列,组成1345的全排列,由于k=11<12,也就是说第11个肯定在首位为3的全排列里边,所以第二个数取3接下来就是考虑剩下145这三个数的全排列里边取第k=11-6=5个,1,4,5,_每个各有2个排列,组成145的全排列。由于k=5<6,也就是说第5个肯定在首位为5的全排列里边,所以第三个数取5。接下来就是考虑剩下14这两个数的排列里边取第k=5-4=1个。1,4每个各有1个排列,组成14的排列,由于k=1,所以第四个数取1。最后加上剩下的最后一个4,结果就是23514结束。

想法代码

public class Solution
{
    public static void Main(string[] args)
    {
        int n = 3;
        int k = 3;
        Solution solution = new Solution();
        string res = solution.GetPermutation(n,k);
        Console.WriteLine(res);
    }

    private static int jiechen(int n)
    {
        if (n <= 1) return n;
        return n * jiechen(n - 1);
    }

    public string GetPermutation(int n, int k)
    {
        List leftlist = new List();
        for (int i = 1; i <= n; i++)
        {
            leftlist.Add(i);
        }
        string forreturn = "";
        while (leftlist.Count > 1)
        {
            int jiechenval = jiechen(n - 1);
            double shang = k * 1.0 / jiechenval;
            if (shang % 1 != 0)
            {
                shang = 1 + Math.Truncate(shang);
            }
            int removeindex = (int)shang - 1;
            forreturn += leftlist[removeindex];
            leftlist.RemoveAt(removeindex);
            k = k - removeindex * jiechenval;
            n--;
        }

        forreturn += leftlist[0].ToString();
        return forreturn;
    }
}

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