leetcode刷题记录--搜索;模拟;数学推导;1716. 计算力扣银行的钱;48. 旋转图像剑指 ;Offer 29. 顺时针打印矩阵

leetcode每日一题

1716. 计算力扣银行的钱

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。

最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。

给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。

示例 1:

输入:n = 4
输出:10
解释:第 4 天后,总额为 1 + 2 + 3 + 4 = 10 。

示例 2:

输入:n = 10
输出:37
解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37 。注意到第二个星期一,Hercy 存入 2 块钱。

示例 3:

输入:n = 20
输出:96
解释:第 20 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 + 4 + 5 + 6 + 7 + 8) = 96 。

暴力代码:

class Solution {
    public int totalMoney(int n) {
        int res = 0;
        //先计算有多少周,然后把这些周的存钱总额相加
        int week = n / 7;
        for(int i = 0;i < week;i++){
            for(int j = i + 1;j <= 7 + i;j++){
                res += j;
            }
        }
        //计算多少周之后,计算还剩多少天没加入进去
        int day = n % 7;
        for(int i = week;i < week+day;i++){
            res+=i+1;
        }
        return res;
    }
}

大佬的数学公式代码

class Solution {
    public int totalMoney(int n) {
        int div = n / 7, r = n % 7;
        return div * (div + 7) * 7 / 2 + (r + 1) * r / 2 + div * r;
    }
}

数学练习题

练习题1

48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

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

leetcode刷题记录--搜索;模拟;数学推导;1716. 计算力扣银行的钱;48. 旋转图像剑指 ;Offer 29. 顺时针打印矩阵_第1张图片

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

leetcode刷题记录--搜索;模拟;数学推导;1716. 计算力扣银行的钱;48. 旋转图像剑指 ;Offer 29. 顺时针打印矩阵_第2张图片

示例 3:

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

示例 4:

输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]

题解:

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        //先沿斜对角线翻转
        for(int i = 0;i < n;i ++)
            for(int j = 0;j < i;j ++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        //再沿垂直竖线翻转
        for(int i = 0;i < n;i ++)
            for(int j = 0, k = n - 1; j < k ; j++, k--){
                int temp = matrix[i][k];
                matrix[i][k] = matrix[i][j];
                matrix[i][j] = temp;
            }
    }
}

解析:

思路很巧妙,先沿斜对角线翻转,再沿垂直竖线翻转

根据这道题,忽然想到了刚加入学校社团的一道题:

练习题2:

自编题:

构造一个蛇形矩阵,根据传入的数字,返回一个二维数组,在奇数列时,数字从前往后递增,在偶数列时,数字从后往前递增

示例1:

输入:10

返回结果:

leetcode刷题记录--搜索;模拟;数学推导;1716. 计算力扣银行的钱;48. 旋转图像剑指 ;Offer 29. 顺时针打印矩阵_第3张图片

代码:

class Solution {
    public int[][] rotate(int n) {
        //构造蛇行矩阵
        int ji = 1;
        int ou = n*2;
        int [][]res = new int[n][n];
        for (int i = 1;i <= n;i++){
            int index = 0;
            if (i % 2 != 0){
                for (int j = ji;j < ji+n;j++){
                    res[i-1][index++] = j;
                }
                ji +=n*2;
            }else{
                for(int k = ou;k > ou-n;k--){
                    res[i-1][index++] = k;
                }
                ou+=n*2;
            }

        }
        return res;
    }
}

解析:

此题更加的是一种回忆吧,当初刚开始学习计算机编程时,这道题想了两天,舍友帮助讲解了两次,到最后考核的时候还是没理解,现在突然回想起来了,进行改变分享吧

练习题3:

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 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]

解法1

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        int rows = matrix.length, columns = matrix[0].length;
        boolean[][] visited = new boolean[rows][columns];
        int total = rows * columns;
        int[] order = new int[total];
        int row = 0, column = 0;
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int directionIndex = 0;
        for (int i = 0; i < total; i++) {
            order[i] = matrix[row][column];
            visited[row][column] = true;
            int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
            if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
                directionIndex = (directionIndex + 1) % 4;
            }
            row += directions[directionIndex][0];
            column += directions[directionIndex][1];
        }
        return order;
    }
}

解法2:

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        int rows = matrix.length, columns = matrix[0].length;
        int[] order = new int[rows * columns];
        int index = 0;
        int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
        while (left <= right && top <= bottom) {
            for (int column = left; column <= right; column++) {
                order[index++] = matrix[top][column];
            }
            for (int row = top + 1; row <= bottom; row++) {
                order[index++] = matrix[row][right];
            }
            if (left < right && top < bottom) {
                for (int column = right - 1; column > left; column--) {
                    order[index++] = matrix[bottom][column];
                }
                for (int row = bottom; row > top; row--) {
                    order[index++] = matrix[row][left];
                }
            }
            left++;
            right--;
            top++;
            bottom--;
        }
        return order;
    }
}

你可能感兴趣的:(算法,leetcode,矩阵,算法,数学,搜索)