【算法】每日算法总结之杨辉三角,解数独,跳跃游戏

这篇博客介绍了三种算法:杨辉三角的动态规划解法,跳跃游戏的贪心策略,以及解数独的回溯算法。通过实例展示了如何实现这些算法,并提供了Java代码示例。博客内容涵盖数组操作、递归和搜索策略,适合进阶的算法学习者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,坚持学习,一起见证技术er的成长~

在这里插入图片描述

算法题目

算法知识点如下
杨辉三角,类型:数组,动态规划,比较简单。
解数独,类型:数组,回溯,比较难。
跳跃游戏,类型,贪心,数组,中等难度。

算法题目描述

杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:
输入: numRows = 1
输出: [[1]]

提示:
1 <= numRows <= 30

java解题代码如下

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if (numRows == 0) {
            return res;
        }
        for (int i = 0; i < numRows; ++i) {
            List<Integer> temp = new ArrayList<Integer>();
            for (int j = 0; j <= i; ++j) {
                temp.add(numberget(i, j));
            }
            res.add(temp);
        }
        return res;
    }
    public int numberget(int i, int j) {
        if (j == 0 || i == j) {
            return 1;
        } else {
            return (numberget(i - 1, j - 1) + numberget(i - 1, j));
        }
    }
}

算法题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。

java解题代码

class Solution {
    public int jump(int[] nums) {
        int end = 0;
        int steps = 0;
        int maxPosition = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            maxPosition = Math.max(maxPosition, i + nums[i]);
            if (i == end) {
                end = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}

题目描述

编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

示例:
在这里插入图片描述

输入:board =
[[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],
[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],
[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”],
[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”],
[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”],
[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”],
[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”],
[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”],
[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]]
输出:
[[“5”,“3”,“4”,“6”,“7”,“8”,“9”,“1”,“2”],
[“6”,“7”,“2”,“1”,“9”,“5”,“3”,“4”,“8”],
[“1”,“9”,“8”,“3”,“4”,“2”,“5”,“6”,“7”],
[“8”,“5”,“9”,“7”,“6”,“1”,“4”,“2”,“3”],
[“4”,“2”,“6”,“8”,“5”,“3”,“7”,“9”,“1”],
[“7”,“1”,“3”,“9”,“2”,“4”,“8”,“5”,“6”],
[“9”,“6”,“1”,“5”,“3”,“7”,“2”,“8”,“4”],
[“2”,“8”,“7”,“4”,“1”,“9”,“6”,“3”,“5”],
[“3”,“4”,“5”,“2”,“8”,“6”,“1”,“7”,“9”]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

在这里插入图片描述
提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’
题目数据 保证 输入数独仅有一个解

以下程序实现了这一功能,请你填补空白处内容:

class Solution {
	boolean row[][] = new boolean[9][9];
	boolean col[][] = new boolean[9][9];
	boolean cell[][][] = new boolean[3][3][9];
	public void solveSudoku(char[][] board) {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] != '.') {
					int t = board[i][j] - '1';
					row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
				}
			}
		}
		dfs(board, 0, 0);
	}
	public boolean dfs(char[][] board, int x, int y) {
		if (y == 9) {
			x++;
			y = 0;
		}
		if (x == 9)
			return true;

        ____________________;

		for (int num = 0; num < 9; num++) {
			if (!row[x][num] && !col[y][num] && !cell[x / 3][y / 3][num]) {
				board[x][y] = (char) (num + '1');
				row[x][num] = col[y][num] = cell[x / 3][y / 3][num] = true;
				if (dfs(board, x, y + 1))
					return true;
				board[x][y] = '.';
				row[x][num] = col[y][num] = cell[x / 3][y / 3][num] = false;
			}
		}
		return false;
	}
}

java在空白处解题代码如下

if (board[x][y] != '.')
    return dfs(board, x, y + 1);
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冷coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值