[力扣] 算法 304 (C#)

304. 二维区域和检索 – 矩阵不可变

public class NumMatrix
{
    readonly int[,] arr;
    public NumMatrix(int[][] matrix)
    {
        var rows = matrix?.Length ?? 0;
        var cols = rows == 0 ? 0 : (matrix.First()?.Length ?? 0);
        arr = new int[rows + 1, cols + 1];
        for (var i = 0; i < rows; i++)
            for (var j = 0; j < cols; j++)
                arr[i + 1, j + 1] = matrix[i][j] + arr[i, j + 1] + arr[i + 1, j] - arr[i, j];
    }
    public int SumRegion(int row1, int col1, int row2, int col2)
    {
        row1++; col1++;
        row2++; col2++;
        return arr[row2, col2] - arr[row1 - 1, col2] - arr[row2, col1 - 1] + arr[row1 - 1, col1 - 1];
    }
}

[力扣] 算法 1175 (C#)

1175. 质数排列

public class Solution {
    const int MOD = 1_000_000_007;
    public int NumPrimeArrangements(int n)
    {
        var cnt = PrimeCount(n);
        var f = Factorial(Math.Max(cnt, n - cnt));
        return (int)(f[cnt] * f[n - cnt] % MOD);
    }

    int PrimeCount(int n)
    {
        var ba = new BitArray(n + 1);
        var ret = 0;
        for (var i = 2; i <= n; i++)
        {
            if (!ba[i])
            {
                ret++;
                for (var j = 2 * i; j <= n; j += i)
                    ba[j] = true;
            }
        }
        return ret;
    }

    long[] Factorial(int max)
    {
        var ret = new long[max + 1];
        ret[0] = 1;
        for (var i = 1; i < ret.Length; i++)
            ret[i] = ret[i - 1] * i % MOD;
        return ret;
    }
}

[力扣] 算法 832 (C#)

832. 翻转图像

public class Solution
{
    public int[][] FlipAndInvertImage(int[][] A)
    {
        for (var i = 0; i < A.Length; i++)
        {
            var left = 0;
            var right = A[0].Length - 1;
            while(left < right)
            {
                if ((A[i][left] ^ A[i][right]) == 0)
                {
                    A[i][left] ^= 1;
                    A[i][right] ^= 1;
                }
                left++;
                right--;
            }
        }
        if (A[0].Length % 2 == 1)
        {
            var mid = A[0].Length / 2;
            for (var i = 0; i < A.Length; i++)
            {
                A[i][mid] ^= 1;
            }
        }
        return A;
    }
}