首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeetCode 1011。二进制搜索,C++和Python相同的思想,但不同的输出

LeetCode 1011。二进制搜索,C++和Python相同的思想,但不同的输出
EN

Stack Overflow用户
提问于 2020-06-28 10:29:42
回答 2查看 159关注 0票数 1

有人能看看我的CPP代码吗?它来自于这个问题:https://leetcode.com/problems/capacity-to-ship-packages-within-d-days/我感到非常沮丧,因为虽然我的python代码可以工作,但是我的cpp代码不能像往常一样工作。忧郁:相同的想法,不同的结果。简直快让我疯了。

正确的输出应该是15。我的Python代码返回正确的输出15,而我的CPP代码返回错误的输出10

我的python代码:

代码语言:javascript
复制
def cnt_days(weights, k):
        total, cnt = 0, 1
        for w in weights:
            if total + w > k:
                total = 0
                cnt += 1
            total += w
        print(total, cnt)
        return cnt

def shipWithinDays(weights, D):
    left = max(weights)
    right = max(weights) * len(weights) // D + 1

    while left < right:
        mid = left + (right - left) // 2
        if cnt_days(weights, mid) > D:
            left = mid + 1
        else:
            right = mid
    return left           


if __name__ == "__main__":
    print(shipWithinDays([1,2,3,4,5,6,7,8,9,10], 5))

我的cpp代码:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int cnt_days(vector<int>& weights, int K)
{
    int total = 0, cnt = 1;
    for (int w: weights)
    {
        if (total + w > K) 
        {
            total = 0;
            cnt++;
        }
        else total += w;
    }
    cout << total <<" "<<  cnt << endl;
    return cnt;
}

int shipWithinDays(vector<int>& weights, int D)
{
    int maximum = *max_element(weights.begin(), weights.end());
    int left = maximum;
    int right = maximum * weights.size() / D + 1;
    while (left < right)
    {
        int mid = left + (right - left)/2;
        if (cnt_days(weights, mid) > D)
            left = mid + 1;
        else
            right = mid;
    }
    return left;    
}

int main()
{
    vector<int> weights = {1,2,3,4,5,6,7,8,9,10};
    int D = 5;
    cout << shipWithinDays(weights, D) << endl;
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-28 11:39:05

移除其他的

代码语言:javascript
复制
else total += w;

应该是

代码语言:javascript
复制
total += w;
票数 1
EN

Stack Overflow用户

发布于 2020-06-28 15:13:53

也许,您可以对您的c++解决方案进行更简单的二进制搜索:

代码语言:javascript
复制
#include <vector>

class Solution {
public:
    int shipWithinDays(std::vector<int>& weights, int d) {
        int lo = 0;
        int hi = INT_MAX;

        for (int weight : weights) {
            lo = max(lo, weight);
        }

        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            int required = 1;
            int cur = 0;

            for (int index = 0; index < weights.size() && required <= d; cur += weights[index++])
                if (cur + weights[index] > mid) {
                    cur = 0;
                    required++;
                }


            if (required > d) {
                lo = mid + 1;

            } else {
                hi = mid;
            }

        }

        return lo;
    }
};

或者使用基本的按位操作:

代码语言:javascript
复制
class Solution {
public:
    int shipWithinDays(vector<int> &weights, int d) {
        int lo = 0;
        int hi = INT_MAX;

        for (int weight : weights)
            lo = max(lo, weight);

        while (lo < hi) {
            int mid = lo + ((hi - lo) >> 1);
            int required = 1;
            int cur = 0;

            for (int index = 0; index < weights.size() && required <= d; cur += weights[index++])
                if (cur + weights[index] > mid)
                    cur = 0, required++;

            if (required > d)
                lo = -~mid;

            else
                hi = mid;

        }

        return lo;
    }
};

同样,python也是这样:

代码语言:javascript
复制
from typing import List

class Solution:
    def shipWithinDays(self, weights: List[int], d: int) -> int:
        lo, hi = max(weights), sum(weights)
        while lo < hi:
            mid = lo + ((hi - lo) >> 1) # or mid = (lo + hi) // 2 || mid = lo + (hi - lo) // 2
            cur, required = 0, 1
            for weight in weights:
                if cur + weight > mid:
                    required += 1
                    cur = 0
                cur += weight
            if required > d:
                lo = -~mid # simply lo = mid + 1
            else:
                hi = mid

        return lo

参考文献

  • 有关更多详细信息,您可以看到讨论委员会。有许多公认的解决方案、解释、各种语言的高效算法,以及时间/空间复杂性分析。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62621262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档