split-array-largest-sum(参考了discuss)

注意,第一种用法,涉及到一些Java的知识。就是采用Object作为HashMap的key的时候,需要重载这个Class的 equals 和 hashCode 这两个方法。其中equals需要判断一下比较元素的类型,而hashCode 里面可以采用 String.valueOf(val).hashCode() ^ 的方法来处理。

在HashMap里面查找的时候,会调用HashMap里面的元素的equals方法,把待查找的元素作为参数传给这个方法,来进行比较和判断元素是否存在于HashMap中。

// 参考 https://discuss.leetcode.com/topic/61315/java-easy-binary-search-solution-8ms
// 开始用类似回溯的方法做,ETL了

public class Solution {

    public int splitArray(int[] nums, int m) {
        int mlen = nums.length - m;
        int minM = 0;
        int maxM = 0;
        int sum = 0;
        for (int k=0; k<nums.length; k++) {
            sum += nums[k];
            if (k > mlen) {
                sum -= nums[k-1-mlen];
            }
            maxM = Math.max(maxM, sum);
            minM = Math.max(minM, nums[k]);
        }
        System.out.printf("min:%d, max %d\n", minM, maxM);
        int result = bsearch(nums, m, minM, maxM);
        return result;
    }

    private int bsearch(int[] nums, int m, int low, int high) {
        int mid = 0;
        while (low < high) {
            mid = low + (high-low) / 2;
            if (isValid(nums, m, mid)) {
                high = mid;

            } else {
                low = mid + 1;
            }
        }
        return high;
    }

    private boolean isValid(int[] nums, int m, int cand) {
        int split = 1;
        int sum = 0;
        for (int i=0; i<nums.length; i++) {
            sum += nums[i];
            if (sum > cand) {
                split++;
                if (split > m) {
                    return false;
                }
                sum = nums[i];
            }
        }
        return true;
    }

    /*
    class KPair {
        public int pos;
        public int m;

        @Override
        public int hashCode() {
            int ret = String.valueOf(pos).hashCode() ^ String.valueOf(m).hashCode();
            return ret;
        }

        @Override
        public boolean equals(Object obj) {

            if (null == obj) {
                return false;
            }
            if (!(obj instanceof KPair)) {
                return false;
            }
            KPair kp = (KPair)obj;
            //System.out.printf("kp%d p%d km%d m%d\n", kp.pos, pos, kp.m, m);
            return kp.pos == pos && kp.m == m;
        }
    }

    public int splitArray(int[] nums, int m) {
        Map mp = new HashMap();

        KPair okp = new KPair();
        int tmp = 0;
        int newval = 0;

        KPair kp =  new KPair();
        kp.pos = 0;
        kp.m = 1;
        //System.out.printf("in1 p%d m%d\n", kp.pos, kp.m);
        mp.put(kp, nums[0]);

        for (int i=1; i<nums.length; i++) {

            okp.pos = i-1;
            okp.m = 1;
            tmp = (int)(mp.get(okp))+nums[i];

            KPair kp2 = new KPair();
            kp2.pos = i;
            kp2.m = 1;
            //System.out.printf("in2 p%d m%d\n", kp2.pos, kp2.m);
            mp.put(kp2, tmp);

            for (int k=0; k<i; k++) {
                // tmp is sum of k+1 to i
                tmp -= nums[k];
                okp.pos = k;

                for (int j=2; j<=m && j<=k+2; j++) {
                    okp.m = j-1;
                    //System.out.printf("for2 p%d m%d\n", okp.pos, okp.m);
                    newval = (int)(mp.get(okp));
                    if (tmp > newval) {
                        newval = tmp;
                    }

                    KPair kp3 = new KPair();
                    kp3.pos = i;
                    kp3.m = j;
                    if (mp.get(kp3) == null || (int)(mp.get(kp3)) > newval) {
                        //System.out.printf("in3 p%d m%d\n", kp3.pos, kp3.m);
                        mp.put(kp3, newval);
                    }
                }
            }
        }

        KPair kpr =  new KPair();
        kpr.pos = nums.length-1;
        kpr.m = m;
        return (int)(mp.get(kpr));
    }
    */

}
时间: 2024-12-22 07:42:04

split-array-largest-sum(参考了discuss)的相关文章

[LeetCode] Split Array Largest Sum 分割数组的最大值

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note:Given m satisfies the following const

Leetcode: Split Array Largest Sum

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note: Given m satisfies the following cons

410. Split Array Largest Sum

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note: Given m satisfies the following cons

410. Split Array Largest Sum 把数组划分为m组,怎样使最大和最小

[抄题]: Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note:If n is the length of array, as

动态规划——Split Array Largest Sum

题意大概就是,给定一个包含非负整数的序列nums以及一个整数m,要求把序列nums分成m份,并且要让这m个子序列各自的和的最大值最小(minimize the largest sum among these m subarrays). Note:If n is the length of array, assume the following constraints are satisfied: 1 ≤ n ≤ 10001 ≤ m ≤ min(50, n) Examples: Input:num

Leetcode 410. Split Array Largest Sum

Problem: Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note: If n is the length of array

Split Array Largest Sum LT410

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Examples: Input: nums = [7,2,5,10,8] m = 2

leetcode410 Split Array Largest Sum

思路: dp. 实现: 1 class Solution 2 { 3 public: 4 int splitArray(vector<int>& nums, int m) 5 { 6 int n = nums.size(); 7 vector<int> sum(n + 1, 0); 8 for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + nums[i - 1]; 9 vector<vector<int>

LC410. Split Array Largest Sum

把一个数组分成m个连续子数组(不能有空数组),求所有分法中,子数组sum的最大值的最小值. 方法1:容易想到的是动态规划 dp[i][j] = min(max(dp[k-1][j-1], sum[k][i]) 1 <= k <= i, dp[i][j]表示用前i个数字,分成j组,最大和的最小值 time:$O(nnm)$ space:$O(nm)$ class Solution { public: typedef long long ll; ll INF = 1e15; int splitAr

Get the largest sum of contiguous subarray in an int array

When I finished reading this problem,I thought I could solve it by scan every single subarray in the array,and the time complexity is cubic.Every subarray could be the eventual one whose sum is the largest,so I did make a conclusion that the best tim