Skip to content

Commit 81edcd9

Browse files
author
binbin.hou
committed
add vT220
1 parent da3ef47 commit 81edcd9

11 files changed

+1041
-3
lines changed

Diff for: pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
<groupId>junit</groupId>
5252
<artifactId>junit</artifactId>
5353
<version>${junit.version}</version>
54-
<optional>true</optional>
55-
<scope>test</scope>
54+
<!-- <optional>true</optional>-->
55+
<!-- <scope>test</scope>-->
5656
</dependency>
5757

5858
</dependencies>

Diff for: src/main/java/com/github/houbb/leetcode/F200T300/T219_ContainsDuplicateII_V2.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import java.util.Map;
77

88
/**
9-
* 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
9+
* 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。
10+
*
11+
* 如果存在,返回 true ;否则,返回 false 。
1012
*
1113
*
1214
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.github.houbb.leetcode.F200T300;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
/**
9+
* # 题目
10+
*
11+
*
12+
* 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
13+
*
14+
* 找出满足下述条件的下标对 (i, j):
15+
*
16+
* i != j,
17+
*
18+
* abs(i - j) <= indexDiff
19+
*
20+
* abs(nums[i] - nums[j]) <= valueDiff
21+
*
22+
* 如果存在,返回 true ;否则,返回 false 。
23+
*
24+
* ## 示例 1:
25+
*
26+
* 输入:nums = [1,2,3,1], indexDiff = 3, valueDiff = 0
27+
* 输出:true
28+
* 解释:可以找出 (i, j) = (0, 3) 。
29+
* 满足下述 3 个条件:
30+
* i != j --> 0 != 3
31+
* abs(i - j) <= indexDiff --> abs(0 - 3) <= 3
32+
* abs(nums[i] - nums[j]) <= valueDiff --> abs(1 - 1) <= 0
33+
*
34+
* ## 示例 2:
35+
*
36+
* 输入:nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3
37+
* 输出:false
38+
* 解释:尝试所有可能的下标对 (i, j) ,均无法满足这 3 个条件,因此返回 false 。
39+
*
40+
* 提示:
41+
*
42+
* 2 <= nums.length <= 10^5
43+
* -10^9 <= nums[i] <= 10^9
44+
* 1 <= indexDiff <= nums.length
45+
* 0 <= valueDiff <= 10^9
46+
*/
47+
public class T220_ContainsDuplicateIII_V1 {
48+
49+
50+
/**
51+
* 思路1:暴力算法。
52+
*
53+
* i != j,
54+
* abs(i - j) <= indexDiff
55+
* abs(nums[i] - nums[j]) <= valueDiff
56+
*
57+
*
58+
* @param nums 数组
59+
* @return 结果
60+
*/
61+
public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {
62+
// 遍历所有可能的 i,j
63+
for(int i = 0; i < nums.length-1; i++) {
64+
for(int j = i + indexDiff; j < nums.length; j++) {
65+
if(Math.abs(nums[i] - nums[j]) <= valueDiff) {
66+
return true;
67+
}
68+
}
69+
}
70+
71+
return false;
72+
}
73+
74+
75+
76+
/**
77+
* 正常获取最小值,需要先排序。
78+
* 但是这里其实是天然的排序的。
79+
* 只需要计算2个之间的距离就行
80+
*
81+
*
82+
* 这里多次计算,可以使用 dp 优化?
83+
* @param otherNums 数字
84+
* @return 结果
85+
*/
86+
private int getMinDistance(List<Integer> otherNums) {
87+
int result = Integer.MAX_VALUE;
88+
for(int i = 0; i < otherNums.size()-1; i++) {
89+
int distance = otherNums.get(i+1) - otherNums.get(i);
90+
if(distance < result) {
91+
result = distance;
92+
}
93+
}
94+
return result;
95+
}
96+
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.github.houbb.leetcode.F200T300;
2+
3+
/**
4+
* # 题目
5+
*
6+
*
7+
* 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
8+
*
9+
* 找出满足下述条件的下标对 (i, j):
10+
*
11+
* i != j,
12+
*
13+
* abs(i - j) <= indexDiff
14+
*
15+
* abs(nums[i] - nums[j]) <= valueDiff
16+
*
17+
* 如果存在,返回 true ;否则,返回 false 。
18+
*
19+
* ## 示例 1:
20+
*
21+
* 输入:nums = [1,2,3,1], indexDiff = 3, valueDiff = 0
22+
* 输出:true
23+
* 解释:可以找出 (i, j) = (0, 3) 。
24+
* 满足下述 3 个条件:
25+
* i != j --> 0 != 3
26+
* abs(i - j) <= indexDiff --> abs(0 - 3) <= 3
27+
* abs(nums[i] - nums[j]) <= valueDiff --> abs(1 - 1) <= 0
28+
*
29+
* ## 示例 2:
30+
*
31+
* 输入:nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3
32+
* 输出:false
33+
* 解释:尝试所有可能的下标对 (i, j) ,均无法满足这 3 个条件,因此返回 false 。
34+
*
35+
* 提示:
36+
*
37+
* 2 <= nums.length <= 10^5
38+
* -10^9 <= nums[i] <= 10^9
39+
* 1 <= indexDiff <= nums.length
40+
* 0 <= valueDiff <= 10^9
41+
*/
42+
public class T220_ContainsDuplicateIII_V2 {
43+
44+
public static void main(String[] args) {
45+
T220_ContainsDuplicateIII_V2 v2 = new T220_ContainsDuplicateIII_V2();
46+
int nums[] = new int[]{1,5,9,1,5,9};
47+
boolean result = v2.containsNearbyAlmostDuplicate(nums, 2, 3);
48+
System.out.println(result);
49+
50+
int nums2[] = new int[]{1,2,3,1};
51+
boolean result2 = v2.containsNearbyAlmostDuplicate(nums2, 3, 0);
52+
System.out.println(result2);
53+
54+
int nums3[] = new int[]{2, 2};
55+
boolean result3 = v2.containsNearbyAlmostDuplicate(nums3, 2, 0);
56+
System.out.println(result3);
57+
}
58+
59+
public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {
60+
// 遍历所有可能的 i,j
61+
for(int i = 0; i < nums.length; i++) {
62+
for(int j = i + 1; j < i+indexDiff+1; j++) {
63+
if(j >= nums.length) {
64+
continue;
65+
}
66+
67+
if(Math.abs(nums[i] - nums[j]) <= valueDiff) {
68+
return true;
69+
}
70+
}
71+
}
72+
73+
return false;
74+
}
75+
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.github.houbb.leetcode.F200T300;
2+
3+
import java.util.*;
4+
5+
/**
6+
* # 题目
7+
*
8+
*
9+
* 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
10+
*
11+
* 找出满足下述条件的下标对 (i, j):
12+
*
13+
* i != j,
14+
*
15+
* abs(i - j) <= indexDiff
16+
*
17+
* abs(nums[i] - nums[j]) <= valueDiff
18+
*
19+
* 如果存在,返回 true ;否则,返回 false 。
20+
*
21+
* ## 示例 1:
22+
*
23+
* 输入:nums = [1,2,3,1], indexDiff = 3, valueDiff = 0
24+
* 输出:true
25+
* 解释:可以找出 (i, j) = (0, 3) 。
26+
* 满足下述 3 个条件:
27+
* i != j --> 0 != 3
28+
* abs(i - j) <= indexDiff --> abs(0 - 3) <= 3
29+
* abs(nums[i] - nums[j]) <= valueDiff --> abs(1 - 1) <= 0
30+
*
31+
* ## 示例 2:
32+
*
33+
* 输入:nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3
34+
* 输出:false
35+
* 解释:尝试所有可能的下标对 (i, j) ,均无法满足这 3 个条件,因此返回 false 。
36+
*
37+
* 提示:
38+
*
39+
* 2 <= nums.length <= 10^5
40+
* -10^9 <= nums[i] <= 10^9
41+
* 1 <= indexDiff <= nums.length
42+
* 0 <= valueDiff <= 10^9
43+
*/
44+
public class T220_ContainsDuplicateIII_V3 {
45+
46+
public static void main(String[] args) {
47+
T220_ContainsDuplicateIII_V3 v2 = new T220_ContainsDuplicateIII_V3();
48+
int nums[] = new int[]{1,5,9,1,5,9};
49+
boolean result = v2.containsNearbyAlmostDuplicate(nums, 2, 3);
50+
System.out.println(result);
51+
52+
int nums2[] = new int[]{1,2,3,1};
53+
boolean result2 = v2.containsNearbyAlmostDuplicate(nums2, 3, 0);
54+
System.out.println(result2);
55+
56+
int nums3[] = new int[]{2, 2};
57+
boolean result3 = v2.containsNearbyAlmostDuplicate(nums3, 2, 0);
58+
System.out.println(result3);
59+
}
60+
61+
/**
62+
* 思路:
63+
*
64+
* AVL 红黑树
65+
*
66+
* @param nums
67+
* @param indexDiff
68+
* @param valueDiff
69+
* @return
70+
*/
71+
public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {
72+
//1. treeSet
73+
// 滑动窗口结合查找表,此时滑动窗口即为查找表本身(控制查找表的大小即可控制窗口大小)
74+
TreeSet<Long> set = new TreeSet<>();
75+
76+
for(int i = 0; i < nums.length; i++) {
77+
// 边添加边查找
78+
// 查找表中是否有大于等于 nums[i] - t 且小于等于 nums[i] + t 的值
79+
// the least key greater than or equal to the given key, or null if there is no such key.
80+
Long ceiling = set.ceiling((long) nums[i] - (long) valueDiff);
81+
if (ceiling != null && ceiling <= ((long) nums[i] + (long) valueDiff)) {
82+
return true;
83+
}
84+
85+
// 添加后,控制查找表(窗口)大小,移除窗口最左边元素
86+
set.add((long) nums[i]);
87+
88+
// 这里其实不会错误删除。因为重复的元素,如果满足,上面就直接 return 了。
89+
// 这里删除的只是这个位置最早的一个值?????
90+
if (set.size() == indexDiff + 1) {
91+
set.remove((long) nums[i - indexDiff]);
92+
}
93+
}
94+
95+
96+
return false;
97+
}
98+
99+
}

0 commit comments

Comments
 (0)