我在LeetCode上解决了搜索插入位置问题.以下代码运行所有测试用例大约需要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;
}
};
Run Code Online (Sandbox Code Playgroud)
当我查看其他人的最佳答案时,我发现了一个奇怪的代码片段.当我将代码段复制粘贴到我的答案中时,上面相同的代码只需要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>{};
}();
Run Code Online (Sandbox Code Playgroud)
Abd*_*lah 13
该片段旨在"提高性能",但需要付出代价.我会解释一下:
std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
这会禁用C和C++标准流的同步.默认情况下,它们会同步以允许混合C和C++ I/O流(例如cout和printf可以在C++文件中编写).
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)
这解决了来自cout的cin.同样,默认情况下,它们与cout之前的cout相关联(即在输入之前输出刷新),因此您可以进行以下示例:
cout << "Number: ";
cin >> number;
Run Code Online (Sandbox Code Playgroud)
当你解开它们时,你可能会在输出(cout)刷新之前得到输入(cin).
这些耦合线有助于使代码运行更快,但代价是之前解释的.所以要谨慎使用.
参考文献:https://www.geeksforgeeks.org/fast-io-for-competitive-programming