换钱的最少货币数&&寻找峰值&&最小覆盖子串

150 阅读1分钟

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;
    }
}