Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9611896

Browse files
Merge branch 'youngyangyang04:master' into master
2 parents b8b62ff + 047c4db commit 9611896

16 files changed

+349
-52
lines changed

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@
254254
33. [二叉树:构造一棵搜索树](./problems/0108.将有序数组转换为二叉搜索树.md)
255255
34. [二叉树:搜索树转成累加树](./problems/0538.把二叉搜索树转换为累加树.md)
256256
35. [二叉树:总结篇!(需要掌握的二叉树技能都在这里了)](./problems/二叉树总结篇.md)
257-
257+
258258
## 回溯算法
259259

260260
题目分类大纲如下:

‎problems/0035.搜索插入位置.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,31 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int {
318318
```
319319

320320

321+
### PHP
322+
323+
```php
324+
// 二分法(1):[左闭右闭]
325+
function searchInsert($nums, $target)
326+
{
327+
$n = count($nums);
328+
$l = 0;
329+
$r = $n - 1;
330+
while ($l <= $r) {
331+
$mid = floor(($l + $r) / 2);
332+
if ($nums[$mid] > $target) {
333+
// 下次搜索在左区间:[$l,$mid-1]
334+
$r = $mid - 1;
335+
} else if ($nums[$mid] < $target) {
336+
// 下次搜索在右区间:[$mid+1,$r]
337+
$l = $mid + 1;
338+
} else {
339+
// 命中返回
340+
return $mid;
341+
}
342+
}
343+
return $r + 1;
344+
}
345+
```
321346

322347

323348
-----------------------

‎problems/0039.组合总和.md‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,18 +370,17 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int)
370370
```js
371371
var combinationSum = function(candidates, target) {
372372
const res = [], path = [];
373-
candidates.sort(); // 排序
373+
candidates.sort((a,b)=>a-b); // 排序
374374
backtracking(0, 0);
375375
return res;
376376
function backtracking(j, sum) {
377-
if (sum > target) return;
378377
if (sum === target) {
379378
res.push(Array.from(path));
380379
return;
381380
}
382381
for(let i = j; i < candidates.length; i++ ) {
383382
const n = candidates[i];
384-
if(n > target - sum) continue;
383+
if(n > target - sum) break;
385384
path.push(n);
386385
sum += n;
387386
backtracking(i, sum);

‎problems/0040.组合总和II.md‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -508,22 +508,27 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int)
508508
*/
509509
var combinationSum2 = function(candidates, target) {
510510
const res = []; path = [], len = candidates.length;
511-
candidates.sort();
511+
candidates.sort((a,b)=>a-b);
512512
backtracking(0, 0);
513513
return res;
514514
function backtracking(sum, i) {
515-
if (sum > target) return;
516515
if (sum === target) {
517516
res.push(Array.from(path));
518517
return;
519518
}
520-
let f = -1;
521519
for(let j = i; j < len; j++) {
522520
const n = candidates[j];
523-
if(n > target - sum || n === f) continue;
521+
if(j > i && candidates[j] === candidates[j-1]){
522+
//若当前元素和前一个元素相等
523+
//则本次循环结束,防止出现重复组合
524+
continue;
525+
}
526+
//如果当前元素值大于目标值-总和的值
527+
//由于数组已排序,那么该元素之后的元素必定不满足条件
528+
//直接终止当前层的递归
529+
if(n > target - sum) break;
524530
path.push(n);
525531
sum += n;
526-
f = n;
527532
backtracking(sum, j + 1);
528533
path.pop();
529534
sum -= n;

‎problems/0070.爬楼梯.md‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,58 @@ var climbStairs = function(n) {
308308
};
309309
```
310310

311+
TypeScript
312+
313+
> 爬2
314+
315+
```typescript
316+
function climbStairs(n: number): number {
317+
/**
318+
dp[i]: i阶楼梯的方法种数
319+
dp[1]: 1;
320+
dp[2]: 2;
321+
...
322+
dp[i]: dp[i - 1] + dp[i - 2];
323+
*/
324+
const dp: number[] = [];
325+
dp[1] = 1;
326+
dp[2] = 2;
327+
for (let i = 3; i <= n; i++) {
328+
dp[i] = dp[i - 1] + dp[i - 2];
329+
}
330+
return dp[n];
331+
};
332+
```
333+
334+
> 爬m阶
335+
336+
```typescript
337+
function climbStairs(n: number): number {
338+
/**
339+
一次可以爬m阶
340+
dp[i]: i阶楼梯的方法种数
341+
dp[1]: 1;
342+
dp[2]: 2;
343+
dp[3]: dp[2] + dp[1];
344+
...
345+
dp[i]: dp[i - 1] + dp[i - 2] + ... + dp[max(i - m, 1)]; 从i-1加到max(i-m, 1)
346+
*/
347+
const m: number = 2; // 本题m为2
348+
const dp: number[] = new Array(n + 1).fill(0);
349+
dp[1] = 1;
350+
dp[2] = 2;
351+
for (let i = 3; i <= n; i++) {
352+
const end: number = Math.max(i - m, 1);
353+
for (let j = i - 1; j >= end; j--) {
354+
dp[i] += dp[j];
355+
}
356+
}
357+
return dp[n];
358+
};
359+
```
360+
311361
### C
362+
312363
```c
313364
int climbStairs(int n){
314365
//若n<=2,返回n

‎problems/0300.最长上升子序列.md‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,39 @@ func lengthOfLIS(nums []int ) int {
168168
}
169169
```
170170

171+
```go
172+
// 动态规划求解
173+
func lengthOfLIS(nums []int) int {
174+
// dp数组的定义 dp[i]表示取第i个元素的时候,表示子序列的长度,其中包括 nums[i] 这个元素
175+
dp := make([]int, len(nums))
176+
177+
// 初始化,所有的元素都应该初始化为1
178+
for i := range dp {
179+
dp[i] = 1
180+
}
181+
182+
ans := dp[0]
183+
for i := 1; i < len(nums); i++ {
184+
for j := 0; j < i; j++ {
185+
if nums[i] > nums[j] {
186+
dp[i] = max(dp[i], dp[j] + 1)
187+
}
188+
}
189+
if dp[i] > ans {
190+
ans = dp[i]
191+
}
192+
}
193+
return ans
194+
}
195+
196+
func max(x, y int) int {
197+
if x > y {
198+
return x
199+
}
200+
return y
201+
}
202+
```
203+
171204
Javascript
172205
```javascript
173206
const lengthOfLIS = (nums) => {

‎problems/0383.赎金信.md‎

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -114,23 +114,25 @@ Java:
114114
```Java
115115
class Solution {
116116
public boolean canConstruct(String ransomNote, String magazine) {
117-
//记录杂志字符串出现的次数
118-
int[] arr = new int[26];
119-
int temp;
120-
for (int i = 0; i < magazine.length(); i++) {
121-
temp = magazine.charAt(i) - 'a';
122-
arr[temp]++;
117+
// 定义一个哈希映射数组
118+
int[] record = new int[26];
119+
120+
// 遍历
121+
for(char c : magazine.toCharArray()){
122+
record[c - 'a'] += 1;
123+
}
124+
125+
for(char c : ransomNote.toCharArray()){
126+
record[c - 'a'] -= 1;
123127
}
124-
for (int i = 0; i < ransomNote.length(); i++) {
125-
temp = ransomNote.charAt(i) - 'a';
126-
//对于金信中的每一个字符都在数组中查找
127-
//找到相应位减一,否则找不到返回false
128-
if (arr[temp] > 0) {
129-
arr[temp]--;
130-
} else {
128+
129+
// 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符
130+
for(int i : record){
131+
if(i < 0){
131132
return false;
132133
}
133134
}
135+
134136
return true;
135137
}
136138
}

‎problems/0496.下一个更大元素I.md‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,39 @@ class Solution:
244244
```
245245

246246
Go:
247+
248+
> 未精简版本
249+
```go
250+
func nextGreaterElement(nums1 []int, nums2 []int) []int {
251+
res := make([]int, len(nums1))
252+
for i := range res { res[i] = -1 }
253+
m := make(map[int]int, len(nums1))
254+
for k, v := range nums1 { m[v] = k }
255+
256+
stack := []int{0}
257+
for i := 1; i < len(nums2); i++ {
258+
top := stack[len(stack)-1]
259+
if nums2[i] < nums2[top] {
260+
stack = append(stack, i)
261+
} else if nums2[i] == nums2[top] {
262+
stack = append(stack, i)
263+
} else {
264+
for len(stack) != 0 && nums2[i] > nums2[top] {
265+
if v, ok := m[nums2[top]]; ok {
266+
res[v] = nums2[i]
267+
}
268+
stack = stack[:len(stack)-1]
269+
if len(stack) != 0 {
270+
top = stack[len(stack)-1]
271+
}
272+
}
273+
stack = append(stack, i)
274+
}
275+
}
276+
return res
277+
}
278+
```
279+
> 精简版本
247280
```go
248281
func nextGreaterElement(nums1 []int, nums2 []int) []int {
249282
res := make([]int, len(nums1))

‎problems/0509.斐波那契数.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,29 @@ var fib = function(n) {
245245
};
246246
```
247247

248+
TypeScript
249+
250+
```typescript
251+
function fib(n: number): number {
252+
/**
253+
dp[i]: 第i个斐波那契数
254+
dp[0]: 0;
255+
dp[1]:1;
256+
...
257+
dp[i] = dp[i - 1] + dp[i - 2];
258+
*/
259+
const dp: number[] = [];
260+
dp[0] = 0;
261+
dp[1] = 1;
262+
for (let i = 2; i <= n; i++) {
263+
dp[i] = dp[i - 1] + dp[i - 2];
264+
}
265+
return dp[n];
266+
};
267+
```
268+
248269
### C
270+
249271
动态规划:
250272
```c
251273
int fib(int n){

‎problems/0674.最长连续递增序列.md‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,45 @@ class Solution:
236236
```
237237

238238
Go:
239+
> 动态规划:
240+
```go
241+
func findLengthOfLCIS(nums []int) int {
242+
if len(nums) == 0 {return 0}
243+
res, count := 1, 1
244+
for i := 0; i < len(nums)-1; i++ {
245+
if nums[i+1] > nums[i] {
246+
count++
247+
}else {
248+
count = 1
249+
}
250+
if count > res {
251+
res = count
252+
}
253+
}
254+
return res
255+
}
256+
```
257+
258+
> 贪心算法:
259+
```go
260+
func findLengthOfLCIS(nums []int) int {
261+
if len(nums) == 0 {return 0}
262+
dp := make([]int, len(nums))
263+
for i := 0; i < len(dp); i++ {
264+
dp[i] = 1
265+
}
266+
res := 1
267+
for i := 0; i < len(nums)-1; i++ {
268+
if nums[i+1] > nums[i] {
269+
dp[i+1] = dp[i] + 1
270+
}
271+
if dp[i+1] > res {
272+
res = dp[i+1]
273+
}
274+
}
275+
return res
276+
}
277+
```
239278

240279
Javascript:
241280

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /