算法与数据结构
csj in cqupt
这个作者很懒,什么都没留下…
展开
-
二维数组按第一列升序,相同就按第二列降序
/*3 12 45 01 24 33 23 3 */public class ArrSort { public static void main(String[] args) { int[][] arr = new int[7][2]; arr[0][0] = 3; arr[0][1] = 1; arr[1][0] = 2; arr[1][1] = 4; arr[2][0] = 5;.原创 2022-04-11 20:04:29 · 698 阅读 · 0 评论 -
力扣518. 零钱兑换2
和零钱兑换1的区别就在于dp表存的值含义不同class Solution { public int change(int amount, int[] coins) { if(amount==0)return 1; int[] dp = new int[amount+1]; for(int i=1;i<dp.length;i++){ if(i%coins[0]==0)dp[i]=1; } .原创 2022-03-10 19:18:48 · 166 阅读 · 0 评论 -
力扣322. 零钱兑换
完全背包和0-1背包很像,只需要把内循环的逆序改为正序,因为每个物品可以重复拿了。class Solution { public int coinChange(int[] coins, int amount) { if(amount==0)return 0; int[] dp = new int[amount+1]; for(int i=0;i<coins.length;i++){ for(int原创 2022-03-10 19:01:41 · 185 阅读 · 0 评论 -
力扣1049. 最后一块石头的重量
二维数组版本: (和之前那到分割等和子集原理非常相似)class Solution { public int lastStoneWeightII(int[] stones){ //这道题其实是有两个背包,一个背包装x重量,另一个背包装sum-x重量,然后要使得两个背包装的重量尽可能多,这样剩下的就越少,也就是sum-x-x=sum-2x越趋于0越好,那么x就应该在不大于sum/2的情况下越大越好,也就是背包问题了,同理capacity = sum/2除不尽也不用管,自然下取整就原创 2022-03-10 16:58:29 · 153 阅读 · 0 评论 -
力扣416. 分割等和子集
class Solution { public boolean canPartition(int[] nums){ //数组要被分成两个,并且元素和相等,转化为背包问题:所有物品总重量为sum(数组元素和),现在有两个容量都为sum/2的背包,问这两个背包是否能被刚好装满,进一步简化:问其中一个背包能否被刚好装满(一个满了,另一个肯定也能刚好满) int sum = 0; for(int num: nums){ sum += .原创 2022-03-09 21:19:52 · 149 阅读 · 0 评论 -
力扣474. 一和零
class Solution { public int findMaxForm(String[] strs, int m, int n) { //两个背包,一个容量m只装0,一个容量n只装1,物品重量有0,1两个维度,每件物品价值为1 int[][] dp = new int[m+1][n+1]; //dp[j][k]:第一个背包能装j个0,第二个背包能装k个1,dp[j][k]就是在使用这两个背包的情况下能装的最大价值 for(i.原创 2022-03-09 20:48:37 · 100 阅读 · 0 评论 -
通俗理解二分查找代码细节
本来以为挺简单的,结果并没有一次过。这里对其中的细节做一些总结(代码+图):原创 2021-06-26 16:11:54 · 130 阅读 · 1 评论