博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数位成本和为目标值的最大数字
阅读量:2048 次
发布时间:2019-04-28

本文共 1542 字,大约阅读时间需要 5 分钟。

原题链接:https://leetcode-cn.com/problems/form-largest-integer-with-digits-that-add-up-to-target/

给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数:

给当前结果添加一个数位(i + 1)的成本为 cost[i] (cost 数组下标从 0 开始)。
总成本必须恰好等于 target 。
添加的数位中没有数字 0 。
由于答案可能会很大,请你以字符串形式返回。
如果按照上述要求无法得到任何整数,请你返回 “0” 。

解题思路

看数据范围,应该是和target有关的一个dp。细细想来就是完全背包。

设dp[i] 为成本刚好为i的能组成的最大的数。

由于这个数可能太大,所以用string 来存储。用mybigger 函数来判断两个string 的大小。由于空指针的存在,所以初始化下。其中dp[0]是第一个合法状态。
要找的答案是最大,所以先加大的数。

代码

class Solution {
public String largestNumber(int[] cost, int target) {
String dp[] = new String[target + 1]; dp[0] = "0"; for(int i = 1; i <= target; i++) {
dp[i] = ""; } String num[] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9"}; //先加大的数 for(int i = 8; i >= 0; i--) {
for(int j = cost[i]; j <= target; j++) {
if(dp[j - cost[i]] != "" && mybigger(dp[j - cost[i]] + num[i], dp[j])) {
dp[j] = dp[j - cost[i]] + num[i]; } } } return dp[target] == "" ? "0" : dp[target].substring(1); } public boolean mybigger(String a, String b) {
if(a.length() != b.length()) {
return a.length() > b.length(); } int i = 0; while(i < a.length()) {
if(a.charAt(i) != b.charAt(i)) {
return a.charAt(i) > b.charAt(i); } i++; } return true; }}

转载地址:http://jqhof.baihongyu.com/

你可能感兴趣的文章
每天一个linux命令(26):用SecureCRT来上传和下载文件(转载自竹子)
查看>>
定时启动计划任务(转载自网络)
查看>>
Javascript的RegExp对象(转载自网络)
查看>>
rwx对于文件和目录的意义
查看>>
借助csv用PHP生成excel文件
查看>>
使用SimpleXML解析xml文件数据
查看>>
php读取excel文档内容(转载)
查看>>
vim基本命令(转载自网络)
查看>>
Linux学习(二十二)Shell基础(二)变量、环境变量配置文件
查看>>
Linux学习(二十四)正则表达式(二)sed
查看>>
Linux学习(二十三)正则表达式(一)grep/egrep
查看>>
Linux学习(二十六)日常管理(一)w、vmstat、top、sar、nload、iostat、iotop
查看>>
Linux学习(二十五)正则表达式(三)awk
查看>>
js和php写日历
查看>>
shell递归遍历目录的方法
查看>>
https改造过程中的一个坑
查看>>
GitLab 实现代码自动部署(转载自https://segmentfault.com/a/1190000011561808)
查看>>
free命令详解(转载)
查看>>
tcp协议端口解释(转载)
查看>>
三次挥手四次挥手(转载)
查看>>