当前位置:网站首页>存在重复元素III[利用排序后的有序性进行剪枝]
存在重复元素III[利用排序后的有序性进行剪枝]
2022-06-25 18:00:00 【REN_林森】
利用排序后的有序性剪枝
前言
当时间复杂度在O(NlongN || N2)时,没有特别要求的情况下,排个序对时间复杂度是毫无影响的,甚至还能拿排完序后的有序性来剪枝,降低运行时间。
不是只有DFS能剪枝,在很多操作中多存在剪枝思想。
一、存在重复元素III

二、排序+剪枝
package everyday.medium;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
// 存在重复元素III
public class ContainsNearbyAlmostDuplicate {
/* target:给定下标的限定范围,元素差值的限定范围,求是否存在这样的 数对。 */
// 暴力
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int n = nums.length;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (Math.abs((long) i - j) <= k
&& Math.abs((long) nums[i] - nums[j]) <= t)
return true;
}
}
return false;
}
}
// 非暴力,巧解:先排序,然后靠着有序来剪枝。(注:反正对于O(NlogN || N2)的时间复杂度,排个序完全每任何影响。)
class ContainsNearbyAlmostDuplicate2 {
/* target:给定下标的限定范围,元素差值的限定范围,求是否存在这样的 数对。 */
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
List<int[]> arr = new ArrayList<>();
int idx = 0;
for (int num : nums) arr.add(new int[]{
idx++, num});
arr.sort(Comparator.comparingInt(o -> o[1]));
// 爆搜 + 剪枝
for (int i = 0; i < arr.size() - 1; i++) {
// 注:其实 j = i + 1也就算第一个剪枝了。
for (int j = i + 1; j < arr.size(); j++) {
int[] a = arr.get(i), b = arr.get(j);
if (Math.abs((long) a[1] - b[1]) <= t
&& Math.abs((long) a[0] - b[0]) <= k) return true;
// 类似剪枝。
if (Math.abs((long) a[1] - b[1]) > t) break;
}
}
return false;
}
}
总结
1)剪枝思想存在很多操作中,不仅仅是DFS。
2)排序什么时候大胆用?有序性是个好条件。
参考文献
边栏推荐
猜你喜欢
Qinheng ch583 USB custom hid debugging record

Three traversal methods of binary tree (recursive + non recursive) complete code

什么是算子?

Deep understanding of ELF files

Recursion and divide and conquer

【工作小技巧】刚入职的软件测试工程师怎么快速上手新岗位
![[matlab] data interpolation](/img/b8/d7e1a5f7c6f56c8312a1fb5d517ac6.png)
[matlab] data interpolation

利用Qt制作美化登录界面框

The stacks 2022:32 marketing technology stacks selected

观察者模式之通用消息发布与订阅
随机推荐
20 provinces and cities announce the road map of the meta universe
Kotlin of Android cultivation manual - several ways to write a custom view
Which of the top ten securities companies has the lowest commission? Is it safe to open an account
十大龙头券商 办理开户安全吗
[tips] how to quickly start a new position for a new software testing engineer
实际开户复杂吗?在线开户安全么?
How to judge whether you are suitable for software testing
什么是算子?
Intelligent dialog 01 redis installation
Wechat applet reports an error: request:fail URL not in domain list
Is the actual account opening complicated? Is online account opening safe?
lock
SQL Server real time backup library requirements
HMS core machine learning service realizes simultaneous interpretation, supports Chinese-English translation and multiple voice broadcast
CGI connects to database through ODBC
什么是泛型以及在集合中泛型的使用[通俗易懂]
篇7:CLion中没有代码提示,,,
[daily record] - bug encountered during BigDecimal Division
MVDR beam MATLAB, MVDR beam forming matlab[easy to understand]
SDN system method | 10 The future of SDN