无限循环发生在哪里?
Posted
技术标签:
【中文标题】无限循环发生在哪里?【英文标题】: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 programs 和 Debugging Guide 【参考方案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
【讨论】:
以上是关于无限循环发生在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在循环开始时调用 requestAnimationFrame 不会导致无限递归?