C++ 同一代码因“而超时”;如果;关于LeetCode的声明

C++ 同一代码因“而超时”;如果;关于LeetCode的声明,c++,algorithm,sorting,c++17,C++,Algorithm,Sorting,C++17,问题来自LeetCode,其中我们必须找出数组中是否有两个不同的指数i和j,使得nums[i]和nums[j]之间的绝对差值最多为t,而i和j之间的绝对差值最多为k。 我的方法是O(N*N),这不应该被接受,但它是可以接受的 认可代码: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { int n = nums.size(); vector<pair<long

问题来自LeetCode,其中我们必须找出数组中是否有两个不同的指数i和j,使得nums[i]nums[j]之间的绝对差值最多为t,而i和j之间的绝对差值最多为k。 我的方法是O(N*N),这不应该被接受,但它是可以接受的

认可代码:

bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
    int n = nums.size();
    vector<pair<long long, int>>list;
    for (int i = 0; i < n; i++)
        list.push_back(make_pair(nums[i], i));
    sort(list.begin(), list.end());
    for (int i = 0; i < n-1; i++) {
        for (int j = i+1; j < n && list[j].first-list[i].first <= t; j++)
            if (abs(list[j].second - list[i].second) <= k)
                return true;
    }

    return false;
}
bool包含任意多个副本(向量和nums、int k、int t){
int n=nums.size();
矢量表;
对于(int i=0;i对于(intj=i+1;j
for (int i = 0; i < imax; ++i) {
   if ( some_condition(i) ) {
       // do something
   }
}
for(int i=0;i
vs

for(int i=0;i
第二个循环终止一次
某些条件(i)
false
,而第一个循环始终运行所有迭代

当您马虎且不注意细节时,代码是不可原谅的:

唯一的区别是在循环中使用了条件“IF”语句


不,这不是唯一的区别!

您不仅添加了一个if,还更改了内部循环的停止条件。这可能会有很大的变化。如果
n
可以很大,您希望预先保留向量空间,而不是在填充时重新分配和复制所有~logn次。
我的方法是O(n*n)
——如果有一个额外停止条件将在何时发生的保证,并且该保证为您带来的东西是<
O(N)
,那么第一种方法不是
O(N*N),但是有些小的。BTW,我已经回答了,我知道TLE代表什么,但是认为缩略语在上下文中有意义,例如我们在LeTeCLE TLE上可能意味着。这是一个好的风格,而不是使用缩写,并且简单地假设读者知道他们应该指的是3个字母eCurym。辛顿和空调。
for (int i = 0; i < imax; ++i) {
   if ( some_condition(i) ) {
       // do something
   }
}
for (int i = 0; i < imax && some_condition(i); ++i) {
    // do something
}