【问题标题】:Where is the infinite loop occurring?无限循环发生在哪里?
【发布时间】:2019-07-12 20:11:43
【问题描述】:

这个问题来自leetcode:

给定一个按升序排序的整数数组 nums,找出给定目标值的开始和结束位置。

您的算法的运行时复杂度必须在 O(log n) 的数量级。

如果在数组中没有找到目标,返回[-1, -1]。

示例 1:

输入:nums = [5,7,7,8,8,10],目标 = 8 输出:[3,4]

这是我的代码:

#include <vector>
#include <iostream>

using namespace std;

vector<int> searchRange(vector<int>& nums, int target)
{
    int left = 0;
    int right = (int)nums.size() - 1;
    std::vector<int> result;
    while(left <= right)
    {
        auto mid = (int)(left + right) / 2;
        if(nums[mid] < target)
            left = mid + 1;
        else
            right = mid;
    }

    int next_left = left;
    int next_right = (int) nums.size() - 1;
    while(next_left < next_right)
    {
        auto mid = (int)(left + right + 1) / 2;
        if(nums[mid] > target)
            next_right = mid - 1;
        else
            next_left = mid;
    }

    result = {next_left, next_right};

    return result;


}


int main()
{
    std::vector<int> nums = {1,2,2,2,2,4};
    int target = 2;

    auto result = searchRange(nums, target);
    for(auto it: result)
        std::cout << it << " ";

    return 0;
}

我不断收到超过时间限制。我不知道如何解决它,任何帮助将不胜感激。

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide

标签: c++


【解决方案1】:

在你的第二个循环中,这一行

auto mid = (int)(left + right + 1) / 2;

应该是

auto mid = (int)(next_left + next_right + 1) / 2;

【讨论】:

    【解决方案2】:

    跟踪逻辑错误的建议。

    while 循环中添加几行以查看索引的变化情况。

    while(left <= right)
    {
        auto mid = (int)(left + right) / 2;
        if(nums[mid] < target)
            left = mid + 1;
        else
            right = mid;
    
        // Debugging output.
        std::cout << "left: " << left
                  << ", mid: " << mid
                  << ", right: " << right << std::endl;
    }
    

    while(next_left < next_right)
    {
        // Incorrect.
        // auto mid = (int)(left + right + 1) / 2;
    
        auto mid = (int)(next_left + next_right + 1) / 2;
        if(nums[mid] > target)
            next_right = mid - 1;
        else
            next_left = mid;
    
        // Debugging output.
        std::cout << "next_left: " << next_left
                  << ", mid: " << mid
                  << ", next_right: " << next_right << std::endl;
    }
    

    这应该会引导你走向正确的方向。

    【讨论】:

    • 不直接回答问题(即不指出和解释错误),但还是蛮有用的。
    【解决方案3】:

    查找左索引

        auto mid = (int)(left + right) / 2;
    

    寻找正确的索引

        auto mid = (int)(next_left + next_right + 1) / 2;
    

    我认为你应该使用

    result = {left, next_right};
    

    要返回正确的结果,它使用 {-1,-1}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多