679 24 Game

class Solution {
    public boolean judgePoint24(int[] nums) {
        List<Double> list = new ArrayList<>();
        for (int num : nums) list.add((double)num);
        return solve(list);
    }

    private boolean solve(List<Double> list){
        if (list.size() == 0) return false;
        if (list.size() == 1) return Math.abs(list.get(0) - 24) < 1e-6;

        for (int i = 0; i < list.size(); i++){
            for (int j = 0; j < list.size(); j++){
                if (i != j){
                    List<Double> list2 = new ArrayList<>();
                    for (int t = 0; t < list.size(); t++){
                        if (t != i && t != j) list2.add(list.get(t));
                    }

                    for (int k = 0; k < 4; k++){
                        if (k < 2 && j < i) continue;
                        if (k == 0){
                            list2.add(list.get(i) + list.get(j));
                        }
                        else if (k == 1){
                            list2.add(list.get(i) * list.get(j));
                        }
                        else if (k == 2){
                            list2.add(list.get(i) - list.get(j));
                        }
                        else{
                            if (list.get(j) != 0){
                                list2.add(list.get(i) / list.get(j));
                            }
                            else{
                                continue;
                            }
                        }
                        if (solve(list2)) return true;
                        list2.remove(list2.size() - 1);
                    }
                }
            }
        }

        return false;
    }
}

399 Evaluate Division

class Solution {
    public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
        Map<String, List<String>> pairs = new HashMap<>();
        Map<String, List<Double>> pairValues = new HashMap<>();

        for (int i = 0; i < equations.length; i++){
            String[] equation = equations[i];

            if (!pairs.containsKey(equation[0])){
                pairs.put(equation[0], new ArrayList<String>());
                pairValues.put(equation[0], new ArrayList<Double>());
            }
            if (!pairs.containsKey(equation[1])){
                pairs.put(equation[1], new ArrayList<String>());
                pairValues.put(equation[1], new ArrayList<Double>());
            }

            pairs.get(equation[0]).add(equation[1]);
            pairValues.get(equation[0]).add(values[i]);
            pairs.get(equation[1]).add(equation[0]);
            pairValues.get(equation[1]).add(1.0 / values[i]);
        }

        double[] ans = new double[queries.length];
        for (int i = 0; i < queries.length; i++){
            String[] query = queries[i];
            ans[i] = dfs(query[0], query[1], pairs, pairValues, new HashSet<String>(), 1.0);
            if (ans[i] == 0) ans[i] = -1.0;
        }

        return ans;
    }

    private double dfs(String start, String end, Map<String, List<String>> pairs, Map<String, List<Double>> pairValues, Set<String> set, double value){
        if (!pairs.containsKey(start)) return 0.0;
        if (set.contains(start)) return 0.0;
        if (start.equals(end)) return value;

        set.add(start);

        List<String> pairList = pairs.get(start);
        List<Double> valueList = pairValues.get(start);
        double temp = 0.0;
        for (int i = 0; i < pairList.size(); i++){
            temp = dfs(pairList.get(i), end, pairs, pairValues, set, value * valueList.get(i));
            if (temp != 0.0) break;
        }
        set.remove(start);
        return temp;
    }
}

638 Shopping Offers

class Solution {
    public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
        Map<List<Integer>, Integer> hash = new HashMap<>();
        return dfs(price, special, needs, hash);
    }

    private int dfs(List<Integer> price, List<List<Integer>> special, List<Integer> needs, Map<List<Integer>, Integer> hash){
        if (hash.containsKey(needs)){
            return hash.get(needs);
        }

        int j = 0, res = dot(price, needs);
        for (List<Integer> s : special){
            ArrayList<Integer> clone = new ArrayList<>(needs);
            for (j = 0; j < needs.size(); j++){
                int diff = clone.get(j) - s.get(j);
                if (diff < 0) break;
                clone.set(j, diff);
            }
            if (j == needs.size()){
                res = Math.min(res, s.get(j) + dfs(price, special, clone, hash));
            }
        }
        hash.put(needs, res);

        return res;
    }

    private int dot(List<Integer> price, List<Integer> needs){
        int sum = 0;
        for (int i = 0; i < price.size(); i++){
            sum += price.get(i) * needs.get(i);
        }

        return sum;
    }
}

491 Increasing Subsequences

class Solution {
    public List<List<Integer>> findSubsequences(int[] nums) {
        Set<List<Integer>> res = new HashSet<>();
        List<Integer> holder = new ArrayList<>();
        helper(res, holder, 0, nums);
        List<List<Integer>> ans = new ArrayList<>(res);
        return ans;
    }

    private void helper(Set<List<Integer>> res, List<Integer> holder, int index, int[] nums){
        if (holder.size() >= 2){
            res.add(new ArrayList<>(holder));
        }

        for (int i = index; i < nums.length; i++){
            if (holder.size() == 0 || holder.get(holder.size() - 1) <= nums[i]){
                holder.add(nums[i]);
                helper(res, holder, i + 1, nums);
                holder.remove(holder.size() - 1);
            }
        }
    }
}

473 Matchsticks to Square

public class Solution {
    public boolean makesquare(int[] nums) {
        if (nums == null || nums.length < 4) return false;
        int sum = 0;
        for (int num : nums) sum += num;
        if (sum % 4 != 0) return false;

        Arrays.sort(nums);
        reverse(nums);

        return dfs(nums, new int[4], 0, sum / 4);
    }

    private boolean dfs(int[] nums, int[] sums, int index, int target) {
        if (index == nums.length) {
            if (sums[0] == target && sums[1] == target && sums[2] == target) {
            return true;
            }
            return false;
        }

        for (int i = 0; i < 4; i++) {
            if (sums[i] + nums[index] > target) continue;
            sums[i] += nums[index];
            if (dfs(nums, sums, index + 1, target)) return true;
            sums[i] -= nums[index];
        }

        return false;
    }

    private void reverse(int[] nums) {
        int i = 0, j = nums.length - 1;
        while (i < j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++; j--;
        }
    }
}

results matching ""

    No results matching ""