我正在解决LeetCode上的Search Insert Position问题。以下代码运行所有测试用例大约需要9毫秒。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int lo = 0, hi = nums.size() - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target < nums[mid]) {
hi = mid - 1;
} else if (target > nums[mid]){
lo = mid + 1;
} else {
return mid;
}
}
return lo;
}
};
当我查看其他人的最佳答案时,我发现了一个奇怪的代码段。当我将代码段复制粘贴到我的答案中时,上面相同的代码只需要4毫秒,这比其他解决方案的近99%快。任何人都可以解释加快速度吗?摘录如下:
#include <vector>
#include <iostream>
using namespace std;
static vector<int> nums=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return vector<int>{};
}();
答案 0 :(得分:13)
这个片段旨在提高性能&#34;但是要付出代价。我将解释:
std::ios::sync_with_stdio(false);
这会禁用C和C ++标准流的同步。默认情况下,它们会同步以允许混合C和C ++ I / O流(例如cout和printf可以在C ++文件中编写)。
cin.tie(NULL);
这解开了来自cout的cin。同样,默认情况下,它们与cout之前的cout相关联(即输入前输出刷新),因此您可以制作以下示例:
cout << "Number: ";
cin >> number;
当你解开它们时,你可能会在输出(cout)刷新之前得到输入(cin)。
这些几行有助于使代码运行更快,但代价是之前解释的。所以要谨慎使用。
参考文献:https://www.geeksforgeeks.org/fast-io-for-competitive-programming