C++ 同一代码因“而超时”;如果;关于LeetCode的声明
问题来自LeetCode,其中我们必须找出数组中是否有两个不同的指数i和j,使得nums[i]和nums[j]之间的绝对差值最多为t,而i和j之间的绝对差值最多为k。 我的方法是O(N*N),这不应该被接受,但它是可以接受的 认可代码: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
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
}