322. 零钱兑换
//动态规划
class Solution {
public int coinChange(int[] coins, int amount) {
int max = amount + 1;
int[] dp = new int[amount + 1];
//dp数组除了第一个,后面都初始化为最大值
Arrays.fill(dp, max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
//当前硬币小于等于金额,则当前硬币可以选择
if (coins[j] <= i) {
//dp[i - coins[j]] + 1 选了当前硬币,剩下的硬币数为 dp[i - coins[j]] + 1,当前总硬币数加一
//dp数组记录最小的硬币数
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
//DFS+剪枝
class Solution {
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
recursion(coins, amount, 0, coins.length - 1);
return minCount == Integer.MAX_VALUE ? -1 : minCount;
}
int minCount = Integer.MAX_VALUE;
/**
* 1、按金额从大到小,从多到少(排序,用余数一步到位)
* 2、预判低于最优解,终止递归(可以返回最优解,不过提升有限,意义不大)
* 3、能整除即可返回
*/
void recursion(int[] coins, int amount, int count, int index) {
if (index < 0 || count + amount / coins[index] >= minCount) return;
if (amount % coins[index] == 0) {
minCount = Math.min(minCount, count + amount / coins[index]);
return;
}
for (int i = amount / coins[index]; i >= 0; i--) {
recursion(coins, amount - i * coins[index], count + i, index - 1);
}
}
}
350. 两个数组的交集 II
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
return intersect(nums2, nums1);
}
HashMap<Integer, Integer> m = new HashMap<>();
for (int n : nums1) {
m.put(n, m.getOrDefault(n, 0) + 1);
}
int k = 0;
for (int n : nums2) {
int cnt = m.getOrDefault(n, 0);
if (cnt > 0) {
nums1[k++] = n;
m.put(n, cnt - 1);
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}
/*
Arrays.copyOfRange(T[ ] original,int from,int to)
将一个原始的数组original,从下标from开始复制,复制到上标to,生成一个新的数组。(这里包括下标from,不包括上标to)
*/
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0, k = 0;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
++i;
} else if (nums1[i] > nums2[j]) {
++j;
} else {
nums1[k++] = nums1[i++];
++j;
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}
387. 字符串中的第一个唯一字符
class Solution {
public int firstUniqChar(String s) {
HashMap<Character, Integer> count = new HashMap<Character, Integer>();
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
count.put(c, count.getOrDefault(c, 0) + 1);
}
for (int i = 0; i < n; i++) {
if (count.get(s.charAt(i)) == 1)
return i;
}
return -1;
}
}
你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步