- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
通俗的来说,动态规划就是把大事情化成小事情,小事情变无的思路,
Leet Code 322: 零钱兑换
描述:
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的
class Solution {
public int coinChange(int[] coins, int amount) {
// 创建一个大小为 amount+1 的数组dp
int[] dp = new int[amount+1];
// 将数组初始化为 -1
Arrays.fill(dp,-1);
// 将金额零的最小硬币个数改为0 即 dp[0] = 0
dp[0] = 0;
// 遍历dp数组,从1下标开始,依次计算金额的最少硬币个数
for(int i = 1;i <= amount;i++) {
// 遍历coins数组
for(int j = 0;j < coins.length;j++){
// 面额>=硬币面值 当dp[i-coins[j]] == -1时,表示没有与之对应的硬币,也就不能组成总金额
if(coins[j] <= i && dp[i-coins[j]] != -1){
// dp[i] == -1时,表示此时还未计算 或 dp[i] > 真正在计算的最少硬币个数 则需要更新dp[i]
if(dp[i] == -1 || dp[i] > dp[i-coins[j]]+1){
dp[i] = dp[i-coins[j]]+1;
}
}
}
}
return dp[amount];
}
}
来源:牛客网 跳石板
描述:
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:N = 4,M = 24: 4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
// 用ArrayList 存放 初本身和i的公约数
public static ArrayList<Integer> maxDivisor(int n ){
ArrayList<Integer> arrayList = new ArrayList<>();
// 这里使用Math.sqrt是为了防止超时
for (int i = 2; i <= Math.sqrt(n); i++) {
if(n % i == 0) {
arrayList.add(i);
// 当n/i!=i时,需要添加到arraylist中,否则会漏解
if (n / i != i) {
arrayList.add(n / i);
}
}
}
return arrayList;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] dp = new int[m+1];
// 将dp数组初始化为-1
Arrays.fill(dp,-1);
// dp[n]的初始状态为0
dp[n] = 0;
for(int i = n;i < m; i++){
// 如果dp[i]=-1 表示当前的位置到不了,所以就不需要往下走了
if(dp[i] == -1) continue;
ArrayList<Integer> arrayList = maxDivisor(i);
// 遍历所有的因子
for(int j : arrayList){
// i+j<=m 防止数组越界
// 因为初始化是-1 求最小值min 就需要判断
if(i + j <= m && dp[i+j] != -1){
dp[i+j] = Math.min(dp[i]+1,dp[i+j]);
}else if(i + j <= m){
dp[i+j] = dp[i] + 1;
}
}
}
//遍历结束就返回dp[m]
// 如果里面是-1就表示到达不了
System.out.println(dp[m]);
}
}
LeetCode 62: 不同路径
描述:
一个机器人位于一个 m x n 网格的左上角(起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
dp[0][0] = 1;
for(int i = 0;i < m;i++){
for(int j = 0; j < n;j++){
if(j==0 || i==0){
dp[i][j] = 1;
}else{
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
LeetCode 53: 最大子数组和
描述:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
class Solution {
public int maxSubArray(int[] nums) {
// 状态F(i): 表示第i个和最大的值
// 状态转移方程: F(i) = max(F(i),F(i-1)+F(i))
// 初始状态:F[0] = nums[0];
// 返回值: 返回max(F(i));
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for(int i = 1; i < nums.length; i++){
dp[i] = Math.max(nums[i],dp[i-1] + nums[i]);
max = Math.max(dp[i],max);
}
return max;
}
}
LeetCode 64: 最小路径和
描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
class Solution {
public int minPathSum(int[][] grid) {
// 状态F(i,j): 到达i,j的最小路径和
// 状态转移方程: F(i,j) = min(F(i,j-1),F(i-1,j))+F(i,j)
// i == 0 => F(i,j) = F(i,j-1) + F(i,j)
// j == 0 => F(i,j) = F(i-1,j) + F(i,j)
// 初始状态: F(0,0) = gird[0][0]
// 返回值: F(grid.length-1,grid[0].length-1)的值就是返回值
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[i].length;j++){
if(i == 0 && j == 0) continue;
if(i == 0) grid[i][j] = grid[i][j-1]+grid[i][j];
else if(j == 0) grid[i][j] = grid[i-1][j]+grid[i][j];
else grid[i][j] = Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];
}
}
return grid[grid.length-1][grid[0].length-1];
}
}
我认为这个问题说明了一切,但我有一个使用 .net 安装工具包的应用程序(在 vs.2005 中),并且用户问我是否可以将它安装在 c:\Program Files\ProgramName 而不是C:
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 Stephen Wolfram 的忠实粉丝,但他绝对是一个不怕自吹自擂的人。在许多引用资料中,他将 Mathematica 颂扬为一种不同的符号编程范式。我不是 Mathematica 用户。
我现在正在使用 Squeak4.1 学习 SmallTalk。我使用 Squeak by Example 作为教程,在这里我反驳了一个 delema,“Morphic 是由...开发的,用于自编程语言
Wikipedia有话要说: Total functional programming (also known as strong functional programming, to be cont
在阅读 Paul Graham's Essays 时, 我对 Lisp 越来越好奇了。 在this article ,他提到最强大的功能之一是您可以编写可以编写其他程序的程序。 我无法在他的网站或其他
我知道 functional programming 有几个定义。 .我认为这是一个模糊的类别。我个人的定义是接近' referential transparency '。 这个问题不是“函数式编程的
我注意到许多顶尖大学都开设了类(class),在这些类(class)中,学生将学习与计算机图形学相关的 CS 专业科目。可悲的是,这是我的大学没有提供的东西,我真的很想在 future 几年的某个时候
我正在安装100%托管代码的.NET(C#)应用程序。安装程序(InnoSetup)始终希望将应用程序安装到Vista x64中的“Program Files(x86)”文件夹中,我认为这是因为安装程
假设在 C 中,我们有以下结构: struct MyData { char key1[20]; long key2; ... /* some data */ }; 本质上,除
这个问题已经有答案了: When should I use ampersand with scanf() (3 个回答) 已关闭 6 年前。 所以我在python3中有这个“程序”,它添加了3个字符串
我编写了一个包含 self 更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。如果安装了应用程序,这将完美地工作,例如在用户主目录中,如果它安装在 C:\
注意:标记为社区维基。 是否有一个很好的分析为什么可视化编程语言仍然没有起飞?这些天我们仍在 80x25 文本窗口中“线性”编码;而我们表示的概念(数据结构、算法)似乎可以更直观地表示出来。 最佳答案
我一直在阅读Code Complete 2 .由于我不是以英语为母语的人,因此我需要一些时间才能理解某些陈述。我希望你描述作者在他的书中所做的这两个陈述之间的区别: You should progra
我在为我的 tomcat 设置 CLASSPATH 时遇到了这个问题。我需要在 tomcat 的 CLASSPATH 中引用我的 2 个安装。其中一个位于 C:\Program Files\Postg
这个问题已经有答案了: How can I lock a file using java (if possible) (8 个回答) 已关闭 6 年前。 我有 2-3 个程序可以修改文件,但如果有一个
我 checkout Reading stdout from one program in another program却没有找到我要找的答案 我是 Linux 的新手,我正在使用 Python 中
我有一个程序可以打印出通过或失败。我想检测卡在那里的程序并回显“超时” 我写了这样一个脚本: #!/bin/bash echo -n 'test' && timeout 5 ./mytest | gr
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
请求:每个进程需要计算自己的组到所有点的距离。我的代码如下: #include stdio.h #include stdlib.h #include math.h #include string.h
我是一名优秀的程序员,十分优秀!