Skip to content

Commit 9d1767e

Browse files
committed
update
1 parent c2c9b31 commit 9d1767e

File tree

10 files changed

+125
-38
lines changed

10 files changed

+125
-38
lines changed

1-100/18.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@
3535
```
3636

3737

38+
-----
39+
40+
思路:
41+
42+
时间复杂度`O(N^3)``3SUM`的基础上增加一个循环,参考`NO.15`
43+
44+
3845
```
3946
/**
4047
* @param {number[]} nums

1-100/20.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@
106106
```
107107

108108

109+
-----
110+
111+
思路:
112+
113+
括号问题一般使用`stack`,按照开始必有结束的原则。
114+
115+
109116
```
110117
/**
111118
* @param {string} s

1-100/22.md

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,36 @@
2626
```
2727

2828

29+
-----
30+
31+
思路:
32+
33+
每一个位置都有2个选择,放置`(`或者`)`
34+
35+
如果`(`的数量超过了`n`说明一定不成立;
36+
37+
如果`)`的数量超过了`(`的数量,也一定不成立;
38+
39+
如果两个的数量都为`n`,那么就是一个有效的完整组合。
40+
41+
2942
```
3043
/**
3144
* @param {number} n
3245
* @return {string[]}
3346
*/
3447
var generateParenthesis = function(n) {
35-
let s=''
36-
let l="(",r=")"
37-
let lN=0,rN=0
38-
let res=[]
39-
function dfs(s,n,lN,rN){
40-
if(lN>n || lN<rN)return
41-
if(lN===n && rN===n)res.push(s)
42-
dfs(s+l,n,lN+1,rN)
43-
dfs(s+r,n,lN,rN+1)
44-
}
45-
dfs(s,n,lN,rN)
46-
return res
48+
let s=''
49+
let l="(",r=")"
50+
let res=[]
51+
function dfs(s,n,lN,rN){
52+
if(lN>n || lN<rN)return
53+
if(lN===n && rN===n)res.push(s)
54+
dfs(s+l,n,lN+1,rN)
55+
dfs(s+r,n,lN,rN+1)
56+
}
57+
dfs(s,n,0,0)
58+
return res
4759
};
4860
4961

1-100/26.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ for (int i = 0; i < len; i++) {
108108
```
109109

110110

111+
-----
112+
113+
思路:
114+
115+
`nums`进行原地重排序,设定一个索引`k`,表示当前需要改变的位置,从`k=0`开始,如果发现有效(不重复),则`nums[k++]=nums[i]`
116+
117+
最终前`k`位的都是无重复的数字。
118+
119+
111120
```
112121
/**
113122
* @param {number[]} nums

1-100/27.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,19 +121,26 @@ for (int i = 0; i < len; i++) {
121121
```
122122

123123

124+
-----
125+
126+
思路:
127+
128+
`NO.26`基本一致,检查条件改变为只要当前`nums[i]!==val`,那么就可以添加到`k`对应的索引中。
129+
130+
124131
```
125132
/**
126133
* @param {number[]} nums
127134
* @param {number} val
128135
* @return {number}
129136
*/
130137
var removeElement = function(nums, val) {
131-
let i=0,j=0
132-
for(i=0;i<nums.length;i++){
133-
if(nums[i]!==val)
134-
nums[j++]=nums[i]
135-
}
136-
return j
138+
let k=0
139+
for(let i=0;i<nums.length;i++){
140+
if(nums[i]!==val)
141+
nums[k++]=nums[i]
142+
}
143+
return k
137144
};
138145
139146

1-100/29.md

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -59,44 +59,89 @@
5959

6060

6161

62-
```
62+
-----
63+
64+
思路:
65+
66+
* 使用减法,最直观的就是每次从被除数`dividend`中减去除数`divisor`,直到`dividend<divisor`,但是效率太低,因为数值是`32`位的数值,很容易`TLE`
67+
68+
* 使用叠加减法,和上面的思路差不多,但并不是每一次都只减去`divisor`,设定变量`m``n`分别为`dividend`还剩下的值,和当前被减的值。
69+
70+
每一次都减去`divisor*i`,直到`m<0`,重置`n`,继续重复。
71+
72+
```js
6373
/**
6474
* @param {number} dividend
6575
* @param {number} divisor
6676
* @return {number}
6777
*/
6878
var divide = function(dividend, divisor) {
69-
70-
// 0:+ 1:-
71-
let neg=0
72-
if(dividend&lt;0){neg=neg^1; dividend=-dividend}
73-
if(divisor&lt;0){neg=neg^1; divisor=-divisor}
74-
if(dividend&lt;divisor)return 0
75-
let res=0
76-
let count=0
79+
let negative=(dividend ^ divisor)<0,
80+
limit=Math.pow(2,31)
81+
82+
if(dividend<divisor)return 0
83+
84+
let res=0,count=0
7785
let n=0, m=dividend
7886
while(true){
7987
n+=divisor
80-
if(m-n&gt;0){
88+
if(m-n>0){
8189
count+=1
8290
m=m-n
8391
res+=count
8492
}else {
93+
// 已经减到0了
8594
if(n===divisor){
8695
if(m-n===0)res++
8796
break
8897
}
98+
// 重置
8999
count=0
90100
n=0
91101
}
92102
}
93-
let limit=Math.pow(2,31)
94-
if(neg===1){
95-
if(res&gt;limit)return -limit
96-
return -res
103+
if(negative){
104+
return Math.max(-res,-limit)
105+
}else{
106+
return Math.min(res,limit-1)
107+
}
108+
};
109+
```
110+
* 使用位操作,位操作中`>>`相当于`/2``<<`相当于`*2`,因此对于`dividend`,找出一个`idx`,使得`dividend>>idx`后,刚好还比`divisor`大。
111+
112+
这说明`idx`对应的除数是有效的,这个除数就是`1<<idx`,再将`dividend`减去当前除数`divisor * ((1 << idx))`,也就是`(divisor << idx)`
113+
114+
另外,由于`js`存在位溢出问题,因此在执行位运算时,计算绝对值`let absBit=Math.abs((dividend >> idx))`
115+
116+
117+
118+
```
119+
/**
120+
* @param {number} dividend
121+
* @param {number} divisor
122+
* @return {number}
123+
*/
124+
var divide = function(dividend, divisor) {
125+
let negative=(dividend ^ divisor)&lt;0,
126+
limit=Math.pow(2,31)
127+
dividend=Math.abs(dividend)
128+
divisor=Math.abs(divisor)
129+
if(dividend&lt;divisor)return 0
130+
131+
let res=0,idx=32
132+
while(idx&gt;=0){
133+
// JS避免位溢出
134+
let absBit=Math.abs((dividend &gt;&gt; idx))
135+
if(absBit &gt;= divisor){
136+
res+=(1 &lt;&lt; idx)
137+
dividend-=(divisor &lt;&lt; idx)
138+
}
139+
idx--
140+
}
141+
if(negative){
142+
return Math.max(-res,-limit)
97143
}else{
98-
if(res&gt;limit-1)return limit-1
99-
return res
144+
return Math.min(res,limit-1)
100145
}
101146
};
102147

1001-1100/1033.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
难度:Easy
44

5-
相关话题:
5+
相关话题:`脑筋急转弯`
66

77
三枚石子放置在数轴上,位置分别为 `a``b``c`
88

1001-1100/1034.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
难度:Middle
44

5-
相关话题:
5+
相关话题:`深度优先搜索`
66

77
给出一个二维整数网格 `grid` ,网格中的每个值表示该位置处的网格块的颜色。
88

1001-1100/1035.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
难度:Middle
44

5-
相关话题:
5+
相关话题:`数组`
66

77
我们在两条独立的水平线上按给定的顺序写下 `A``B` 中的整数。
88

1001-1100/1036.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
难度:Hard
44

5-
相关话题:
5+
相关话题:`广度优先搜索`
66

77
在一个 10^6 x 10^6 的网格中,每个网格块的坐标为 `(x, y)` ,其中 `0 &lt;= x, y &lt; 10^6`
88

0 commit comments

Comments
 (0)