NC126 换钱的最少货币数
1、解题思路
这个题目可以转换为背包问题求解。完全背包转化为0-1背包。(好像是完全背包转0-1背包)
2、代码
import java.util.*;
public class Solution {
/**
* 最少货币数
* @param arr int整型一维数组 the array
* @param aim int整型 the target
* @return int整型
*/
public int minMoney (int[] arr, int aim) {
if (aim == 0) {
return 0;
}
List<Integer> money = new ArrayList<>();
List<Integer> cnt = new ArrayList<>();
for (int m : arr) {
int time = 1;
while (m * time <= aim) {
money.add(m * time);
cnt.add(time);
time *= 2;
}
}
int[] dp = new int[aim + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 0; i < money.size(); i++) {
int m = money.get(i);
int c = cnt.get(i);
for (int j = aim; j >= m; j--) {
if (dp[j - m] != Integer.MAX_VALUE) {
dp[j] = Math.min(dp[j], dp[j - m] + c);
}
}
}
return dp[aim] == Integer.MAX_VALUE ? -1 : dp[aim];
}
}
NC107 寻找峰值
1、解题思路
二分查找,注意处理边界问题就可以了。
2、代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findPeakElement (int[] nums) {
if (nums.length == 1) {
return 0;
}
int l = 0;
int r = nums.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (mid == nums.length - 1) {
if (nums[mid] > nums[mid - 1]) {
return mid;
} else {
r = mid - 1;
continue;
}
}
if (mid == 0) {
if (nums[0] > nums[1]) {
return mid;
} else {
l = mid + 1;
continue;
}
}
if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
return mid;
}
if (nums[mid] <= nums[mid + 1]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
}
}
NC28 最小覆盖子串
1、解题思路
滑动窗口+哈希表
2、代码
import java.util.*;
public class Solution {
/**
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
public String minWindow(String S, String T) {
if (T.length() == 1) {
for (char c : S.toCharArray()) {
if (c == T.charAt(0)) {
return T;
}
}
}
Map<Character, Integer> cur = new HashMap<>();
Map<Character, Integer> target = new HashMap<>();
for (char c : T.toCharArray()) {
target.put(c, target.getOrDefault(c, 0) + 1);
}
int len = Integer.MAX_VALUE;
int lastL = 0, lastR = 0;
int curL = 0;
int curR = 1;
cur.put(S.charAt(0), 1);
char[] chars = S.toCharArray();
for (int i = 1; i < chars.length; i++) {
char aChar = chars[i];
curR = i;
cur.put(aChar, cur.getOrDefault(aChar, 0) + 1);
while (check(cur, target)) {
int curLen = curR - curL + 1;
if (curLen < len) {
len = curLen;
lastL = curL;
lastR = curR;
}
cur.put(S.charAt(curL), cur.get(S.charAt(curL)) - 1);
curL++;
}
}
if (len == Integer.MAX_VALUE) {
return "";
} else {
return S.substring(lastL, lastR + 1);
}
}
private boolean check(Map<Character, Integer> cur, Map<Character, Integer> target) {
for (Character character : target.keySet()) {
if (cur.getOrDefault(character, 0) < target.get(character)) {
return false;
}
}
return true;
}
}