Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
youngyangyang04 committed Oct 25, 2021
1 parent 33768a0 commit 104ba7c
Show file tree
Hide file tree
Showing 19 changed files with 804 additions and 197 deletions.
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者)
> 2. **PDF版本**[「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ)
> 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。
> 3. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
> 3. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
> 4. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。
> 5. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
Expand Down Expand Up @@ -97,6 +97,8 @@
* [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md)
* [力扣上的代码想在本地编译运行?](./problems/前序/力扣上的代码想在本地编译运行?.md)
* [什么是核心代码模式,什么又是ACM模式?](./problems/前序/什么是核心代码模式,什么又是ACM模式?.md)
* [ACM模式如何构造二叉树](./problems/前序/ACM模式如何构建二叉树.md)
* [解密互联网大厂研发流程](./problems/前序/互联网大厂研发流程.md)

* 工具
* [一站式vim配置](https://github.com/youngyangyang04/PowerVim)
Expand Down Expand Up @@ -124,6 +126,11 @@

## 知识星球精选

* [HR特意刁难非科班!](./problems/知识星球精选/HR特意刁难非科班.md)
* [offer的选择](./problems/知识星球精选/offer的选择.md)
* [天下乌鸦一般黑,哪家没有PUA?](./problems/知识星球精选/天下乌鸦一般黑.md)
* [初入大三,考研VS工作](./problems/知识星球精选/初入大三选择考研VS工作.md)
* [非科班2021秋招总结](./problems/知识星球精选/非科班2021秋招总结.md)
* [秋招下半场依然没offer,怎么办?](./problems/知识星球精选/秋招下半场依然没offer.md)
* [合适自己的就是最好的](./problems/知识星球精选/合适自己的就是最好的.md)
* [为什么都说客户端会消失](./problems/知识星球精选/客三消.md)
Expand Down Expand Up @@ -466,6 +473,7 @@
* [234.回文链表](./problems/0234.回文链表.md)
* [143.重排链表](./problems/0143.重排链表.md)【数组】【双向队列】【直接操作链表】
* [141.环形链表](./problems/0141.环形链表.md)
* [160.相交链表](./problems/面试题02.07.链表相交.md)

## 哈希表
* [205.同构字符串](./problems/0205.同构字符串.md):【哈希表的应用】
Expand Down
57 changes: 26 additions & 31 deletions problems/0035.搜索插入位置.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@
你可以假设数组中无重复元素。

示例 1:
输入: [1,3,5,6], 5
输出: 2
* 输入: [1,3,5,6], 5
* 输出: 2

示例 2:
输入: [1,3,5,6], 2
输出: 1
* 输入: [1,3,5,6], 2
* 输出: 1

示例 3:
输入: [1,3,5,6], 7
输出: 4
* 输入: [1,3,5,6], 7
* 输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0
* 输入: [1,3,5,6], 0
* 输出: 0

# 思路
## 思路

这道题目不难,但是为什么通过率相对来说并不高呢,我理解是大家对边界处理的判断有所失误导致的。

Expand All @@ -50,13 +50,13 @@

接下来我将从暴力的解法和二分法来讲解此题,也借此好好讲一讲二分查找法。

## 暴力解法
### 暴力解法

暴力解题 不一定时间消耗就非常高,关键看实现的方式,就像是二分查找时间消耗不一定就很低,是一样的。

## 暴力解法C++代码
C++代码

```
```CPP
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
Expand All @@ -75,14 +75,14 @@ public:
};
```
时间复杂度:O(n)
空间复杂度:O(1)
* 时间复杂度:O(n)
* 空间复杂度:O(1)
效率如下:
![35_搜索插入位置](https://img-blog.csdnimg.cn/20201216232127268.png)
## 二分法
### 二分法
既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。
Expand All @@ -108,7 +108,7 @@ public:
要在二分查找的过程中,保持不变量,这也就是**循环不变量** (感兴趣的同学可以查一查)。
## 二分法第一种写法
### 二分法第一种写法
以这道题目来举例,以下的代码中定义 target 是在一个在左闭右闭的区间里,**也就是[left, right] (这个很重要)**。
Expand Down Expand Up @@ -142,13 +142,13 @@ public:
}
};
```
时间复杂度:O(logn)
时间复杂度:O(1)
* 时间复杂度:O(logn)
* 时间复杂度:O(1)

效率如下:
![35_搜索插入位置2](https://img-blog.csdnimg.cn/2020121623272877.png)

## 二分法第二种写法
### 二分法第二种写法

如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) 。

Expand Down Expand Up @@ -185,27 +185,22 @@ public:
};
```
时间复杂度:O(logn)
时间复杂度:O(1)
* 时间复杂度:O(logn)
* 时间复杂度:O(1)
# 总结
## 总结
希望通过这道题目,大家会发现平时写二分法,为什么总写不好,就是因为对区间定义不清楚。
确定要查找的区间到底是左闭右开[left, right),还是左闭又闭[left, right],这就是不变量。
然后在**二分查找的循环中,坚持循环不变量的原则**,很多细节问题,自然会知道如何处理了。
**循序渐进学算法,认准「代码随想录」,Carl手把手带你过关斩将!**




## 其他语言版本
Java
### Java
```java
class Solution {
Expand Down Expand Up @@ -234,7 +229,7 @@ class Solution {
```


Python
### Python
```python3
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
Expand All @@ -252,7 +247,7 @@ class Solution:
return right + 1
```

JavaScript:
### JavaScript
```js
var searchInsert = function (nums, target) {
let l = 0, r = nums.length - 1, ans = nums.length;
Expand All @@ -272,7 +267,7 @@ var searchInsert = function (nums, target) {
};
```

Swift:
### Swift

```swift
// 暴力法
Expand Down
21 changes: 10 additions & 11 deletions problems/0037.解数独.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg)

## 37. 解数独
# 37. 解数独

[力扣题目链接](https://leetcode-cn.com/problems/sudoku-solver/)

Expand Down Expand Up @@ -53,7 +53,7 @@
![37.解数独](https://img-blog.csdnimg.cn/2020111720451790.png)


## 回溯三部曲
### 回溯三部曲

* 递归函数以及参数

Expand Down Expand Up @@ -115,7 +115,7 @@ bool backtracking(vector<vector<char>>& board) {
那么会直接返回, **这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!**
## 判断棋盘是否合法
### 判断棋盘是否合法
判断棋盘是否合法有如下三个维度:
Expand Down Expand Up @@ -150,9 +150,8 @@ bool isValid(int row, int col, char val, vector<vector<char>>& board) {
}
```

最后整体代码如下
最后整体C++代码如下

## C++代码

```CPP
class Solution {
Expand Down Expand Up @@ -218,7 +217,7 @@ public:
## 其他语言版本
Java
### Java
```java
class Solution {
public void solveSudoku(char[][] board) {
Expand Down Expand Up @@ -286,7 +285,7 @@ class Solution {
}
```

Python
### Python
```python3
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
Expand Down Expand Up @@ -321,7 +320,7 @@ class Solution:
backtrack(board)
```

Python3:
### Python3

```python3
class Solution:
Expand Down Expand Up @@ -374,7 +373,7 @@ class Solution:
self.isSolved()
```

Go:
### Go

```go
func solveSudoku(board [][]byte) {
Expand Down Expand Up @@ -431,7 +430,7 @@ func isvalid(row,col int,k byte,board [][]byte)bool{



Javascript:
### Javascript
```Javascript
var solveSudoku = function(board) {
function isValid(row, col, val, board) {
Expand Down Expand Up @@ -487,7 +486,7 @@ var solveSudoku = function(board) {
};
```

C:
### C

```C
bool isValid(char** board, int row, int col, int k) {
Expand Down
22 changes: 11 additions & 11 deletions problems/0046.全排列.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
<p align="center"><strong>欢迎大家<a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>


## 46.全排列
# 46.全排列

[力扣题目链接](https://leetcode-cn.com/problems/permutations/)

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:
输入: [1,2,3]
输出:
* 输入: [1,2,3]
* 输出:
[
[1,2,3],
[1,3,2],
Expand All @@ -42,7 +42,7 @@

![46.全排列](https://img-blog.csdnimg.cn/20201209174225145.png)

## 回溯三部曲
### 回溯三部曲

* 递归函数参数

Expand Down Expand Up @@ -105,7 +105,6 @@ for (int i = 0; i < nums.size(); i++) {

整体C++代码如下:


```CPP
class Solution {
public:
Expand Down Expand Up @@ -148,8 +147,8 @@ public:
## 其他语言版本
### Java
Java:
```java
class Solution {
Expand Down Expand Up @@ -182,7 +181,8 @@ class Solution {
}
}
}
```
```

```java
// 解法2:通过判断path中是否存在数字,排除已经选择的数字
class Solution {
Expand Down Expand Up @@ -210,8 +210,8 @@ class Solution {
}
```

Python
```python3
### Python
```python
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = [] #存放符合条件结果的集合
Expand Down Expand Up @@ -251,7 +251,7 @@ class Solution:
return res
```

Go:
### Go
```Go
var res [][]int
func permute(nums []int) [][]int {
Expand All @@ -278,7 +278,7 @@ func backTrack(nums []int,numsLen int,path []int) {

```

Javascript:
### Javascript

```js

Expand Down
Loading

0 comments on commit 104ba7c

Please sign in to comment.