Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 7dd466a

Browse files
committed
2 parents e9119f1 + 7b9ad48 commit 7dd466a

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

算法/有序数组求交集.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
var a = []
2+
3+
for (let index = 0; index < 500; index++) {
4+
a.push(i)
5+
}
6+
7+
for (var i = 16; i < 10000; i++) {
8+
a.push(i)
9+
}
10+
11+
var b = []
12+
13+
for (let index = 0; index < 500; index++) {
14+
b.push(i)
15+
}
16+
17+
for (var i = 10001; i < 50000; i++) {
18+
b.push(i)
19+
}
20+
21+
function mapIntersection(arr1, arr2) {
22+
console.time()
23+
var map = new Map()
24+
for (var i = 0; i < arr1.length; i++) {
25+
map.set(arr1[i], true)
26+
}
27+
28+
var result = []
29+
for (var i = 0; i < arr2.length; i++) {
30+
var val = arr2[i]
31+
if (map.get(val)) {
32+
result.push(val)
33+
}
34+
}
35+
console.timeEnd()
36+
return result
37+
}
38+
39+
console.log("mapIntersection", mapIntersection(a, b))
40+
41+
function pointIntersection(arr1, arr2) {
42+
console.time()
43+
let i = 0
44+
let j = 0
45+
46+
let l1 = arr1.length
47+
let l2 = arr2.length
48+
49+
let result = []
50+
while (i < l1 && j < l2) {
51+
let val1 = arr1[i]
52+
let val2 = arr2[j]
53+
let val1Last = arr1[i - 1]
54+
let val2Last = arr2[j - 1]
55+
56+
if (val1 > val2) {
57+
i++
58+
}
59+
60+
if (val1 === val2) {
61+
result.push(val1)
62+
i++
63+
j++
64+
}
65+
66+
if (val1 < val2) {
67+
j++
68+
}
69+
70+
if (val1 > val2Last || val2 > val1Last) {
71+
console.timeEnd()
72+
return result
73+
}
74+
}
75+
console.timeEnd()
76+
return result
77+
}
78+
79+
console.log('pointIntersection', pointIntersection(a, b))
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
540. 有序数组中的单一元素
3+
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
4+
5+
示例 1:
6+
7+
输入: [1,1,2,3,3,4,4,8,8]
8+
输出: 2
9+
示例 2:
10+
11+
输入: [3,3,7,7,10,11,11]
12+
输出: 10
13+
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
14+
*/
15+
16+
function singleNonDuplicate(nums) {
17+
let len = nums.length
18+
19+
let lo = 0
20+
let hi = len - 1
21+
22+
while (lo < hi) {
23+
let mid = lo + Math.floor((hi - lo) / 2)
24+
let midVal = nums[mid]
25+
26+
// 被mid后的数组长度是奇数还是偶数
27+
let halvesAreEven = (hi - mid) % 2 == 0;
28+
if (midVal === nums[mid - 1]) {
29+
if (halvesAreEven) {
30+
// [0, 1, 1, 2, 2]
31+
// mid
32+
// 显然左边是奇数 [0] hi是mid往左两位
33+
hi = mid - 2
34+
}else {
35+
// [0, 0, 1, 1, 2, 2, 3]
36+
// mid
37+
// 显然右边是奇数 [2, 2, 3] lo是mid往右一位
38+
lo = mid + 1
39+
}
40+
41+
}else if (midVal === nums[mid + 1]) {
42+
if (halvesAreEven) {
43+
// [0, 0, 1, 1, 2]
44+
// mid
45+
// 右边是奇数 [2] lo是mid右移动两位
46+
lo = mid + 2
47+
}else {
48+
// [0, 0, 1, 2, 2, 3, 3]
49+
// mid
50+
// 左边是奇数 [0, 0, 1] hi是mid左移一位
51+
hi = mid - 1
52+
}
53+
} else {
54+
return midVal
55+
}
56+
}
57+
return nums[lo]
58+
}
59+
60+
61+
console.log(singleNonDuplicate([3,3,7,7,10,11,11]))

0 commit comments

Comments
 (0)