Merge branch 'master' of github.com:youngyangyang04/leetcode-master
This commit is contained in:
commit
d3bfbbe658
|
|
@ -133,6 +133,7 @@ public:
|
||||||
### Java:
|
### Java:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
//使用哈希表
|
||||||
public int[] twoSum(int[] nums, int target) {
|
public int[] twoSum(int[] nums, int target) {
|
||||||
int[] res = new int[2];
|
int[] res = new int[2];
|
||||||
if(nums == null || nums.length == 0){
|
if(nums == null || nums.length == 0){
|
||||||
|
|
@ -151,6 +152,43 @@ public int[] twoSum(int[] nums, int target) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
```java
|
||||||
|
//使用双指针
|
||||||
|
public int[] twoSum(int[] nums, int target) {
|
||||||
|
int m=0,n=0,k,board=0;
|
||||||
|
int[] res=new int[2];
|
||||||
|
int[] tmp1=new int[nums.length];
|
||||||
|
//备份原本下标的nums数组
|
||||||
|
System.arraycopy(nums,0,tmp1,0,nums.length);
|
||||||
|
//将nums排序
|
||||||
|
Arrays.sort(nums);
|
||||||
|
//双指针
|
||||||
|
for(int i=0,j=nums.length-1;i<j;){
|
||||||
|
if(nums[i]+nums[j]<target)
|
||||||
|
i++;
|
||||||
|
else if(nums[i]+nums[j]>target)
|
||||||
|
j--;
|
||||||
|
else if(nums[i]+nums[j]==target){
|
||||||
|
m=i;
|
||||||
|
n=j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//找到nums[m]在tmp1数组中的下标
|
||||||
|
for(k=0;k<nums.length;k++){
|
||||||
|
if(tmp1[k]==nums[m]){
|
||||||
|
res[0]=k;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//找到nums[n]在tmp1数组中的下标
|
||||||
|
for(int i=0;i<nums.length;i++){
|
||||||
|
if(tmp1[i]==nums[n]&&i!=k)
|
||||||
|
res[1]=i;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Python:
|
### Python:
|
||||||
(版本一) 使用字典
|
(版本一) 使用字典
|
||||||
|
|
|
||||||
|
|
@ -618,7 +618,7 @@ char * longestPalindrome(char * s){
|
||||||
### C#:
|
### C#:
|
||||||
|
|
||||||
動態規則:
|
動態規則:
|
||||||
```c#
|
```csharp
|
||||||
public class Solution {
|
public class Solution {
|
||||||
|
|
||||||
public string LongestPalindrome(string s) {
|
public string LongestPalindrome(string s) {
|
||||||
|
|
@ -648,7 +648,7 @@ public class Solution {
|
||||||
```
|
```
|
||||||
|
|
||||||
雙指針:
|
雙指針:
|
||||||
```C#
|
```csharp
|
||||||
public class Solution {
|
public class Solution {
|
||||||
int maxlenth = 0;
|
int maxlenth = 0;
|
||||||
int left = 0;
|
int left = 0;
|
||||||
|
|
|
||||||
|
|
@ -256,7 +256,7 @@ while (right > left) {
|
||||||
## 其他语言版本
|
## 其他语言版本
|
||||||
|
|
||||||
### Java:
|
### Java:
|
||||||
|
(版本一) 双指针
|
||||||
```Java
|
```Java
|
||||||
class Solution {
|
class Solution {
|
||||||
public List<List<Integer>> threeSum(int[] nums) {
|
public List<List<Integer>> threeSum(int[] nums) {
|
||||||
|
|
@ -297,7 +297,43 @@ class Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
(版本二) 使用哈希集合
|
||||||
|
```Java
|
||||||
|
class Solution {
|
||||||
|
public List<List<Integer>> threeSum(int[] nums) {
|
||||||
|
List<List<Integer>> result = new ArrayList<>();
|
||||||
|
Arrays.sort(nums);
|
||||||
|
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
// 如果第一个元素大于零,不可能凑成三元组
|
||||||
|
if (nums[i] > 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
// 三元组元素a去重
|
||||||
|
if (i > 0 && nums[i] == nums[i - 1]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<Integer> set = new HashSet<>();
|
||||||
|
for (int j = i + 1; j < nums.length; j++) {
|
||||||
|
// 三元组元素b去重
|
||||||
|
if (j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int c = -nums[i] - nums[j];
|
||||||
|
if (set.contains(c)) {
|
||||||
|
result.add(Arrays.asList(nums[i], nums[j], c));
|
||||||
|
set.remove(c); // 三元组元素c去重
|
||||||
|
} else {
|
||||||
|
set.add(nums[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
### Python:
|
### Python:
|
||||||
(版本一) 双指针
|
(版本一) 双指针
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -733,7 +733,7 @@ def backtracking(result, letter_map, digits, path, index)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public IList<string> res = new List<string>();
|
public IList<string> res = new List<string>();
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ public:
|
||||||
|
|
||||||
// ListNode *tmp = slow->next; C++释放内存的逻辑
|
// ListNode *tmp = slow->next; C++释放内存的逻辑
|
||||||
// slow->next = tmp->next;
|
// slow->next = tmp->next;
|
||||||
// delete nth;
|
// delete tmp;
|
||||||
|
|
||||||
return dummyHead->next;
|
return dummyHead->next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -462,7 +462,7 @@ impl Solution {
|
||||||
```
|
```
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 虚拟头结点
|
// 虚拟头结点
|
||||||
public ListNode SwapPairs(ListNode head)
|
public ListNode SwapPairs(ListNode head)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -425,8 +425,8 @@ public:
|
||||||
if (needle.size() == 0) {
|
if (needle.size() == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int next[needle.size()];
|
vector<int> next(needle.size());
|
||||||
getNext(next, needle);
|
getNext(&next[0], needle);
|
||||||
int j = -1; // // 因为next数组里记录的起始位置为-1
|
int j = -1; // // 因为next数组里记录的起始位置为-1
|
||||||
for (int i = 0; i < haystack.size(); i++) { // 注意i就从0开始
|
for (int i = 0; i < haystack.size(); i++) { // 注意i就从0开始
|
||||||
while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配
|
while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配
|
||||||
|
|
@ -524,8 +524,8 @@ public:
|
||||||
if (needle.size() == 0) {
|
if (needle.size() == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int next[needle.size()];
|
vector<int> next(needle.size());
|
||||||
getNext(next, needle);
|
getNext(&next[0], needle);
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (int i = 0; i < haystack.size(); i++) {
|
for (int i = 0; i < haystack.size(); i++) {
|
||||||
while(j > 0 && haystack[i] != needle[j]) {
|
while(j > 0 && haystack[i] != needle[j]) {
|
||||||
|
|
@ -1359,7 +1359,7 @@ impl Solution {
|
||||||
```
|
```
|
||||||
|
|
||||||
>前缀表统一不减一
|
>前缀表统一不减一
|
||||||
```C#
|
```csharp
|
||||||
public int StrStr(string haystack, string needle)
|
public int StrStr(string haystack, string needle)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(needle))
|
if (string.IsNullOrEmpty(needle))
|
||||||
|
|
@ -1428,4 +1428,3 @@ public int[] GetNext(string needle)
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -331,7 +331,7 @@ class Solution {
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
public int[] SearchRange(int[] nums, int target) {
|
public int[] SearchRange(int[] nums, int target) {
|
||||||
|
|
||||||
var leftBorder = GetLeftBorder(nums, target);
|
var leftBorder = GetLeftBorder(nums, target);
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,34 @@ class Solution:
|
||||||
|
|
||||||
### Go
|
### Go
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
/**
|
||||||
|
* @date: 2024 Jan 06
|
||||||
|
* @time: 13:44
|
||||||
|
* @author: Chris
|
||||||
|
**/
|
||||||
|
// 贪心算法优化版
|
||||||
|
|
||||||
|
// 记录步骤规则:每超过上一次可达最大范围,需要跳跃一次,次数+1
|
||||||
|
// 记录位置:i == lastDistance + 1
|
||||||
|
func jump(nums []int) int {
|
||||||
|
// 根据题目规则,初始位置为nums[0]
|
||||||
|
lastDistance := 0 // 上一次覆盖范围
|
||||||
|
curDistance := 0 // 当前覆盖范围(可达最大范围)
|
||||||
|
minStep := 0 // 记录最少跳跃次数
|
||||||
|
|
||||||
|
for i := 0; i < len(nums); i++ {
|
||||||
|
if i == lastDistance+1 { // 在上一次可达范围+1的位置,记录步骤
|
||||||
|
minStep++ // 跳跃次数+1
|
||||||
|
lastDistance = curDistance // 记录时才可以更新
|
||||||
|
}
|
||||||
|
curDistance = max(nums[i]+i, curDistance) // 更新当前可达的最大范围
|
||||||
|
}
|
||||||
|
return minStep
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// 贪心版本一
|
// 贪心版本一
|
||||||
func jump(nums []int) int {
|
func jump(nums []int) int {
|
||||||
|
|
@ -464,7 +492,34 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int jump(int* nums, int numsSize) {
|
||||||
|
if(numsSize == 1){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int count = 0;
|
||||||
|
// 记录当前能走的最远距离
|
||||||
|
int curDistance = 0;
|
||||||
|
// 记录下一步能走的最远距离
|
||||||
|
int nextDistance = 0;
|
||||||
|
for(int i = 0; i < numsSize; i++){
|
||||||
|
nextDistance = max(i + nums[i], nextDistance);
|
||||||
|
// 下标到了当前的最大距离
|
||||||
|
if(i == nextDistance){
|
||||||
|
count++;
|
||||||
|
curDistance = nextDistance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// 版本二
|
// 版本二
|
||||||
public class Solution
|
public class Solution
|
||||||
|
|
@ -490,3 +545,4 @@ public class Solution
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,25 @@ class Solution:
|
||||||
|
|
||||||
```
|
```
|
||||||
### Go
|
### Go
|
||||||
|
贪心法
|
||||||
|
```go
|
||||||
|
func maxSubArray(nums []int) int {
|
||||||
|
max := nums[0]
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
for i := 0; i < len(nums); i++{
|
||||||
|
count += nums[i]
|
||||||
|
if count > max{
|
||||||
|
max = count
|
||||||
|
}
|
||||||
|
if count < 0 {
|
||||||
|
count = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
```
|
||||||
|
动态规划
|
||||||
```go
|
```go
|
||||||
func maxSubArray(nums []int) int {
|
func maxSubArray(nums []int) int {
|
||||||
maxSum := nums[0]
|
maxSum := nums[0]
|
||||||
|
|
|
||||||
|
|
@ -306,6 +306,47 @@ class Solution(object):
|
||||||
return result
|
return result
|
||||||
```
|
```
|
||||||
|
|
||||||
|
版本二:定义四个边界
|
||||||
|
```python
|
||||||
|
class Solution(object):
|
||||||
|
def spiralOrder(self, matrix):
|
||||||
|
"""
|
||||||
|
:type matrix: List[List[int]]
|
||||||
|
:rtype: List[int]
|
||||||
|
"""
|
||||||
|
if not matrix:
|
||||||
|
return []
|
||||||
|
|
||||||
|
rows = len(matrix)
|
||||||
|
cols = len(matrix[0])
|
||||||
|
top, bottom, left, right = 0, rows - 1, 0, cols - 1
|
||||||
|
print_list = []
|
||||||
|
|
||||||
|
while top <= bottom and left <= right:
|
||||||
|
# 从左到右
|
||||||
|
for i in range(left, right + 1):
|
||||||
|
print_list.append(matrix[top][i])
|
||||||
|
top += 1
|
||||||
|
|
||||||
|
# 从上到下
|
||||||
|
for i in range(top, bottom + 1):
|
||||||
|
print_list.append(matrix[i][right])
|
||||||
|
right -= 1
|
||||||
|
|
||||||
|
# 从右到左
|
||||||
|
if top <= bottom:
|
||||||
|
for i in range(right, left - 1, -1):
|
||||||
|
print_list.append(matrix[bottom][i])
|
||||||
|
bottom -= 1
|
||||||
|
|
||||||
|
# 从下到上
|
||||||
|
if left <= right:
|
||||||
|
for i in range(bottom, top - 1, -1):
|
||||||
|
print_list.append(matrix[i][left])
|
||||||
|
left += 1
|
||||||
|
|
||||||
|
return print_list
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|
|
||||||
|
|
@ -336,9 +336,76 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
// 根据左边界进行排序
|
||||||
|
int cmp(const void * var1, const void * var2){
|
||||||
|
int *v1 = *(int **) var1;
|
||||||
|
int *v2 = *(int **) var2;
|
||||||
|
return v1[0] - v2[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) {
|
||||||
|
int ** result = malloc(sizeof (int *) * intervalsSize);
|
||||||
|
* returnColumnSizes = malloc(sizeof (int ) * intervalsSize);
|
||||||
|
for(int i = 0; i < intervalsSize; i++){
|
||||||
|
result[i] = malloc(sizeof (int ) * 2);
|
||||||
|
}
|
||||||
|
qsort(intervals, intervalsSize, sizeof (int *), cmp);
|
||||||
|
int count = 0;
|
||||||
|
for(int i = 0; i < intervalsSize; i++){
|
||||||
|
// 记录区间的左右边界
|
||||||
|
int L = intervals[i][0], R = intervals[i][1];
|
||||||
|
// 如果count为0或者前一区间的右区间小于此时的左边,加入结果中
|
||||||
|
if (count == 0 || result[count - 1][1] < L) {
|
||||||
|
returnColumnSizes[0][count] = 2;
|
||||||
|
result[count][0] = L;
|
||||||
|
result[count][1] = R;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
else{ // 更新右边界的值
|
||||||
|
result[count - 1][1] = max(R, result[count - 1][1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*returnSize = count;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int[][] Merge(int[][] intervals)
|
||||||
|
{
|
||||||
|
if (intervals.Length == 0)
|
||||||
|
return intervals;
|
||||||
|
Array.Sort(intervals, (a, b) => a[0] - b[0]);
|
||||||
|
List<List<int>> res = new List<List<int>>();
|
||||||
|
res.Add(intervals[0].ToList());
|
||||||
|
for (int i = 1; i < intervals.Length; i++)
|
||||||
|
{
|
||||||
|
if (res[res.Count - 1][1] >= intervals[i][0])
|
||||||
|
{
|
||||||
|
res[res.Count - 1][1] = Math.Max(res[res.Count - 1][1], intervals[i][1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res.Add(intervals[i].ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res.Select(x => x.ToArray()).ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,11 +87,11 @@ public:
|
||||||
|
|
||||||
// 下面开始的四个for就是模拟转了一圈
|
// 下面开始的四个for就是模拟转了一圈
|
||||||
// 模拟填充上行从左到右(左闭右开)
|
// 模拟填充上行从左到右(左闭右开)
|
||||||
for (j = starty; j < n - offset; j++) {
|
for (j; j < n - offset; j++) {
|
||||||
res[startx][j] = count++;
|
res[i][j] = count++;
|
||||||
}
|
}
|
||||||
// 模拟填充右列从上到下(左闭右开)
|
// 模拟填充右列从上到下(左闭右开)
|
||||||
for (i = startx; i < n - offset; i++) {
|
for (i; i < n - offset; i++) {
|
||||||
res[i][j] = count++;
|
res[i][j] = count++;
|
||||||
}
|
}
|
||||||
// 模拟填充下行从右到左(左闭右开)
|
// 模拟填充下行从右到左(左闭右开)
|
||||||
|
|
@ -138,42 +138,51 @@ public:
|
||||||
```Java
|
```Java
|
||||||
class Solution {
|
class Solution {
|
||||||
public int[][] generateMatrix(int n) {
|
public int[][] generateMatrix(int n) {
|
||||||
int loop = 0; // 控制循环次数
|
int[][] nums = new int[n][n];
|
||||||
int[][] res = new int[n][n];
|
int startX = 0, startY = 0; // 每一圈的起始点
|
||||||
int start = 0; // 每次循环的开始点(start, start)
|
int offset = 1;
|
||||||
int count = 1; // 定义填充数字
|
int count = 1; // 矩阵中需要填写的数字
|
||||||
int i, j;
|
int loop = 1; // 记录当前的圈数
|
||||||
|
int i, j; // j 代表列, i 代表行;
|
||||||
|
|
||||||
while (loop++ < n / 2) { // 判断边界后,loop从1开始
|
while (loop <= n / 2) {
|
||||||
// 模拟上侧从左到右
|
|
||||||
for (j = start; j < n - loop; j++) {
|
// 顶部
|
||||||
res[start][j] = count++;
|
// 左闭右开,所以判断循环结束时, j 不能等于 n - offset
|
||||||
|
for (j = startY; j < n - offset; j++) {
|
||||||
|
nums[startX][j] = count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟右侧从上到下
|
// 右列
|
||||||
for (i = start; i < n - loop; i++) {
|
// 左闭右开,所以判断循环结束时, i 不能等于 n - offset
|
||||||
res[i][j] = count++;
|
for (i = startX; i < n - offset; i++) {
|
||||||
|
nums[i][j] = count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟下侧从右到左
|
// 底部
|
||||||
for (; j >= loop; j--) {
|
// 左闭右开,所以判断循环结束时, j != startY
|
||||||
res[i][j] = count++;
|
for (; j > startY; j--) {
|
||||||
|
nums[i][j] = count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟左侧从下到上
|
// 左列
|
||||||
for (; i >= loop; i--) {
|
// 左闭右开,所以判断循环结束时, i != startX
|
||||||
res[i][j] = count++;
|
for (; i > startX; i--) {
|
||||||
|
nums[i][j] = count++;
|
||||||
}
|
}
|
||||||
start++;
|
startX++;
|
||||||
|
startY++;
|
||||||
|
offset++;
|
||||||
|
loop++;
|
||||||
}
|
}
|
||||||
|
if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值
|
||||||
if (n % 2 == 1) {
|
nums[startX][startY] = count;
|
||||||
res[start][start] = count;
|
|
||||||
}
|
}
|
||||||
|
return nums;
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### python3:
|
### python3:
|
||||||
|
|
@ -207,6 +216,50 @@ class Solution:
|
||||||
return nums
|
return nums
|
||||||
```
|
```
|
||||||
|
|
||||||
|
版本二:定义四个边界
|
||||||
|
```python
|
||||||
|
class Solution(object):
|
||||||
|
def generateMatrix(self, n):
|
||||||
|
if n <= 0:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 初始化 n x n 矩阵
|
||||||
|
matrix = [[0]*n for _ in range(n)]
|
||||||
|
|
||||||
|
# 初始化边界和起始值
|
||||||
|
top, bottom, left, right = 0, n-1, 0, n-1
|
||||||
|
num = 1
|
||||||
|
|
||||||
|
while top <= bottom and left <= right:
|
||||||
|
# 从左到右填充上边界
|
||||||
|
for i in range(left, right + 1):
|
||||||
|
matrix[top][i] = num
|
||||||
|
num += 1
|
||||||
|
top += 1
|
||||||
|
|
||||||
|
# 从上到下填充右边界
|
||||||
|
for i in range(top, bottom + 1):
|
||||||
|
matrix[i][right] = num
|
||||||
|
num += 1
|
||||||
|
right -= 1
|
||||||
|
|
||||||
|
# 从右到左填充下边界
|
||||||
|
|
||||||
|
for i in range(right, left - 1, -1):
|
||||||
|
matrix[bottom][i] = num
|
||||||
|
num += 1
|
||||||
|
bottom -= 1
|
||||||
|
|
||||||
|
# 从下到上填充左边界
|
||||||
|
|
||||||
|
for i in range(bottom, top - 1, -1):
|
||||||
|
matrix[i][left] = num
|
||||||
|
num += 1
|
||||||
|
left += 1
|
||||||
|
|
||||||
|
return matrix
|
||||||
|
```
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
|
|
||||||
|
|
@ -536,8 +536,29 @@ object Solution {
|
||||||
```
|
```
|
||||||
|
|
||||||
### c#
|
### c#
|
||||||
|
```csharp
|
||||||
|
// 二维数组
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int UniquePaths(int m, int n)
|
||||||
|
{
|
||||||
|
int[,] dp = new int[m, n];
|
||||||
|
for (int i = 0; i < m; i++) dp[i, 0] = 1;
|
||||||
|
for (int j = 0; j < n; j++) dp[0, j] = 1;
|
||||||
|
for (int i = 1; i < m; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < n; j++)
|
||||||
|
{
|
||||||
|
dp[i, j] = dp[i - 1, j] + dp[i, j - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[m - 1, n - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
|
// 一维数组
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public int UniquePaths(int m, int n)
|
public int UniquePaths(int m, int n)
|
||||||
|
|
|
||||||
|
|
@ -734,6 +734,30 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int UniquePathsWithObstacles(int[][] obstacleGrid)
|
||||||
|
{
|
||||||
|
int m = obstacleGrid.Length;
|
||||||
|
int n = obstacleGrid[0].Length;
|
||||||
|
int[,] dp = new int[m, n];
|
||||||
|
if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1) return 0;
|
||||||
|
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i, 0] = 1;
|
||||||
|
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0, j] = 1;
|
||||||
|
for (int i = 1; i < m; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < n; j++)
|
||||||
|
{
|
||||||
|
if (obstacleGrid[i][j] == 1) continue;
|
||||||
|
dp[i, j] = dp[i - 1, j] + dp[i, j - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[m - 1, n - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -468,7 +468,7 @@ object Solution {
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
public class Solution {
|
public class Solution {
|
||||||
public int ClimbStairs(int n) {
|
public int ClimbStairs(int n) {
|
||||||
if(n<=2) return n;
|
if(n<=2) return n;
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,32 @@ class climbStairs{
|
||||||
|
|
||||||
|
|
||||||
### Go:
|
### Go:
|
||||||
|
```go
|
||||||
|
func climbStairs(n int, m int) int {
|
||||||
|
dp := make([]int, n+1)
|
||||||
|
dp[0] = 1
|
||||||
|
for i := 1; i <= n; i++ {
|
||||||
|
for j := 1; j <= m; j++ {
|
||||||
|
if i-j >= 0 {
|
||||||
|
dp[i] += dp[i-j]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[n]
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 读取输入n,m
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
input, _ := reader.ReadString('\n')
|
||||||
|
input = strings.TrimSpace(input)
|
||||||
|
nv := strings.Split(input, " ")
|
||||||
|
n, _ := strconv.Atoi(nv[0])
|
||||||
|
m, _ := strconv.Atoi(nv[1])
|
||||||
|
result := climbStairs(n, m)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -793,7 +793,7 @@ end
|
||||||
|
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 暴力
|
// 暴力
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -158,13 +158,6 @@ public:
|
||||||
|
|
||||||
其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。
|
其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。
|
||||||
|
|
||||||
当然本题去重的逻辑,也可以这么写
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
if (i > startIndex && nums[i] == nums[i - 1] ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 其他语言版本
|
## 其他语言版本
|
||||||
|
|
||||||
|
|
@ -641,7 +634,7 @@ object Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```c#
|
```csharp
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public IList<IList<int>> res = new List<IList<int>>();
|
public IList<IList<int>> res = new List<IList<int>>();
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,25 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int NumTrees(int n)
|
||||||
|
{
|
||||||
|
int[] dp = new int[n + 1];
|
||||||
|
dp[0] = 1;
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= i; j++)
|
||||||
|
{
|
||||||
|
dp[i] += dp[j - 1] * dp[i - j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -792,7 +792,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public long val = Int64.MinValue;
|
public long val = Int64.MinValue;
|
||||||
public bool IsValidBST(TreeNode root)
|
public bool IsValidBST(TreeNode root)
|
||||||
|
|
|
||||||
|
|
@ -898,7 +898,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public bool IsSymmetric(TreeNode root)
|
public bool IsSymmetric(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -463,7 +463,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public IList<IList<int>> LevelOrder(TreeNode root)
|
public IList<IList<int>> LevelOrder(TreeNode root)
|
||||||
{
|
{
|
||||||
var res = new List<IList<int>>();
|
var res = new List<IList<int>>();
|
||||||
|
|
@ -825,7 +825,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public IList<IList<int>> LevelOrderBottom(TreeNode root)
|
public IList<IList<int>> LevelOrderBottom(TreeNode root)
|
||||||
{
|
{
|
||||||
var res = new List<IList<int>>();
|
var res = new List<IList<int>>();
|
||||||
|
|
|
||||||
|
|
@ -1033,7 +1033,10 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
|
||||||
|
0104.二叉树的最大深度
|
||||||
|
|
||||||
|
```csharp
|
||||||
// 递归法
|
// 递归法
|
||||||
public int MaxDepth(TreeNode root) {
|
public int MaxDepth(TreeNode root) {
|
||||||
if(root == null) return 0;
|
if(root == null) return 0;
|
||||||
|
|
@ -1044,7 +1047,7 @@ public int MaxDepth(TreeNode root) {
|
||||||
return 1 + Math.Max(leftDepth, rightDepth);
|
return 1 + Math.Max(leftDepth, rightDepth);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```C#
|
```csharp
|
||||||
// 前序遍历
|
// 前序遍历
|
||||||
int result = 0;
|
int result = 0;
|
||||||
public int MaxDepth(TreeNode root)
|
public int MaxDepth(TreeNode root)
|
||||||
|
|
@ -1065,7 +1068,7 @@ public void GetDepth(TreeNode root, int depth)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```C#
|
```csharp
|
||||||
// 迭代法
|
// 迭代法
|
||||||
public int MaxDepth(TreeNode root)
|
public int MaxDepth(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
@ -1088,7 +1091,76 @@ public int MaxDepth(TreeNode root)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
559.n叉树的最大深度
|
||||||
|
递归法
|
||||||
|
```csharp
|
||||||
|
/*
|
||||||
|
递归法
|
||||||
|
*/
|
||||||
|
public class Solution {
|
||||||
|
public int MaxDepth(Node root) {
|
||||||
|
int res = 0;
|
||||||
|
/* 终止条件 */
|
||||||
|
if(root == null){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* logic */
|
||||||
|
// 遍历当前节点的子节点
|
||||||
|
for (int i = 0; i < root.children.Count; i++)
|
||||||
|
{
|
||||||
|
res = Math.Max(res, MaxDepth(root.children[i]));
|
||||||
|
}
|
||||||
|
return res + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @lc code=end
|
||||||
|
```
|
||||||
|
迭代法(层序遍历)
|
||||||
|
```csharp
|
||||||
|
/*
|
||||||
|
迭代法
|
||||||
|
*/
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int MaxDepth(Node root)
|
||||||
|
{
|
||||||
|
Queue<Node> que = new Queue<Node>(); // 使用泛型队列存储节点
|
||||||
|
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
if(root != null){
|
||||||
|
que.Enqueue(root); // 将根节点加入队列
|
||||||
|
}
|
||||||
|
while (que.Count > 0)
|
||||||
|
{
|
||||||
|
int size = que.Count; // 获取当前层的节点数
|
||||||
|
res++; // 深度加一
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
// 每一层的遍历
|
||||||
|
|
||||||
|
var curNode = que.Dequeue(); // 取出队列中的节点
|
||||||
|
for (int j = 0; j < curNode.children.Count; j++)
|
||||||
|
{
|
||||||
|
if (curNode.children[j] != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(curNode.children[j]); // 将子节点加入队列
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res; // 返回树的最大深度
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1229,7 +1229,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public TreeNode BuildTree(int[] inorder, int[] postorder)
|
public TreeNode BuildTree(int[] inorder, int[] postorder)
|
||||||
{
|
{
|
||||||
if (inorder.Length == 0 || postorder.Length == null) return null;
|
if (inorder.Length == 0 || postorder.Length == null) return null;
|
||||||
|
|
|
||||||
|
|
@ -909,7 +909,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public bool IsBalanced(TreeNode root)
|
public bool IsBalanced(TreeNode root)
|
||||||
{
|
{
|
||||||
return GetHeight(root) == -1 ? false : true;
|
return GetHeight(root) == -1 ? false : true;
|
||||||
|
|
|
||||||
|
|
@ -709,7 +709,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public int MinDepth(TreeNode root)
|
public int MinDepth(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
@ -725,7 +725,7 @@ public int MinDepth(TreeNode root)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```C#
|
```csharp
|
||||||
// 迭代
|
// 迭代
|
||||||
public int MinDepth(TreeNode root)
|
public int MinDepth(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1513,7 +1513,7 @@ impl Solution {
|
||||||
|
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 0112.路径总和
|
// 0112.路径总和
|
||||||
// 递归
|
// 递归
|
||||||
public bool HasPathSum(TreeNode root, int targetSum)
|
public bool HasPathSum(TreeNode root, int targetSum)
|
||||||
|
|
@ -1523,8 +1523,64 @@ public bool HasPathSum(TreeNode root, int targetSum)
|
||||||
return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val);
|
return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
0113.路径总和:
|
||||||
|
```csharp
|
||||||
|
/*
|
||||||
|
* @lc app=leetcode id=113 lang=csharp
|
||||||
|
* 0113.路径总和 II
|
||||||
|
* [113] Path Sum II
|
||||||
|
* 递归法
|
||||||
|
*/
|
||||||
|
public class Solution {
|
||||||
|
private List<List<int>> result = new List<List<int>>();
|
||||||
|
private List<int> path = new List<int>();
|
||||||
|
|
||||||
|
// Main function to find paths with the given sum
|
||||||
|
public IList<IList<int>> PathSum(TreeNode root, int targetSum) {
|
||||||
|
result.Clear();
|
||||||
|
path.Clear();
|
||||||
|
if (root == null) return result.Select(list => list as IList<int>).ToList();
|
||||||
|
path.Add(root.val); // Add the root node to the path
|
||||||
|
traversal(root, targetSum - root.val); // Start the traversal
|
||||||
|
return result.Select(list => list as IList<int>).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursive function to traverse the tree and find paths
|
||||||
|
private void traversal(TreeNode node, int count) {
|
||||||
|
// If a leaf node is reached and the target sum is achieved
|
||||||
|
if (node.left == null && node.right == null && count == 0) {
|
||||||
|
result.Add(new List<int>(path)); // Add a copy of the path to the result
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a leaf node is reached and the target sum is not achieved, or if it's not a leaf node
|
||||||
|
if (node.left == null && node.right == null) return;
|
||||||
|
|
||||||
|
// Traverse the left subtree
|
||||||
|
if (node.left != null) {
|
||||||
|
path.Add(node.left.val);
|
||||||
|
count -= node.left.val;
|
||||||
|
traversal(node.left, count); // Recursive call
|
||||||
|
count += node.left.val; // Backtrack
|
||||||
|
path.RemoveAt(path.Count - 1); // Backtrack
|
||||||
|
}
|
||||||
|
|
||||||
|
// Traverse the right subtree
|
||||||
|
if (node.right != null) {
|
||||||
|
path.Add(node.right.val);
|
||||||
|
count -= node.right.val;
|
||||||
|
traversal(node.right, count); // Recursive call
|
||||||
|
count += node.right.val; // Backtrack
|
||||||
|
path.RemoveAt(path.Count - 1); // Backtrack
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @lc code=end
|
||||||
|
|
||||||
|
```
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -358,7 +358,84 @@ function connect(root: NodePro | null): NodePro | null {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
//递归
|
||||||
|
public class Solution {
|
||||||
|
public Node Connect(Node root) {
|
||||||
|
if (root == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectNodes(root.left, root.right);
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConnectNodes(Node node1, Node node2) {
|
||||||
|
if (node1 == null || node2 == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将左子节点的 next 指向右子节点
|
||||||
|
node1.next = node2;
|
||||||
|
|
||||||
|
// 递归连接当前节点的左右子节点
|
||||||
|
ConnectNodes(node1.left, node1.right);
|
||||||
|
ConnectNodes(node2.left, node2.right);
|
||||||
|
|
||||||
|
// 连接跨越父节点的两个子树
|
||||||
|
ConnectNodes(node1.right, node2.left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 迭代
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public Node Connect(Node root)
|
||||||
|
{
|
||||||
|
Queue<Node> que = new Queue<Node>();
|
||||||
|
|
||||||
|
if (root != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (que.Count > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
var queSize = que.Count;
|
||||||
|
for (int i = 0; i < queSize; i++)
|
||||||
|
{
|
||||||
|
var cur = que.Dequeue();
|
||||||
|
|
||||||
|
// 当这个节点不是这一层的最后的节点
|
||||||
|
if (i != queSize - 1)
|
||||||
|
{
|
||||||
|
// 当前节点指向下一个节点
|
||||||
|
cur.next = que.Peek();
|
||||||
|
}
|
||||||
|
// 否则指向空
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur.next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur.left != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(cur.left);
|
||||||
|
}
|
||||||
|
if (cur.right != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(cur.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|
|
||||||
|
|
@ -531,6 +531,52 @@ public class Solution
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
> 贪心
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define min(a, b) ((a) > (b) ? (b) : (a))
|
||||||
|
|
||||||
|
int maxProfit(int* prices, int pricesSize) {
|
||||||
|
int low = INT_MIN;
|
||||||
|
int result = 0;
|
||||||
|
for(int i = 0; i < pricesSize; i++){
|
||||||
|
low = min(low, prices[i]);
|
||||||
|
result = max(result, prices[i] - low);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 动态规划
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int maxProfit(int* prices, int pricesSize){
|
||||||
|
if(pricesSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// dp初始化
|
||||||
|
int ** dp = malloc(sizeof (int *) * pricesSize);
|
||||||
|
for(int i = 0; i < pricesSize; i++){
|
||||||
|
dp[i] = malloc(sizeof (int ) * 2);
|
||||||
|
}
|
||||||
|
// 下标0表示持有股票的情况下的最大现金,下标1表示不持有股票的情况下获得的最大现金
|
||||||
|
dp[0][0] = -prices[0];
|
||||||
|
dp[0][1] = 0;
|
||||||
|
for(int i = 1; i < pricesSize; i++){
|
||||||
|
dp[i][0] = max(dp[i - 1][0], - prices[i]);
|
||||||
|
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
|
||||||
|
}
|
||||||
|
return dp[pricesSize - 1][1];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
> 贪心
|
> 贪心
|
||||||
|
|
@ -568,4 +614,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -365,6 +365,49 @@ public class Solution
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
> 动态规划
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int maxProfit(int* prices, int pricesSize){
|
||||||
|
int **dp = malloc(sizeof (int *) * pricesSize);
|
||||||
|
for (int i = 0; i < pricesSize; ++i) {
|
||||||
|
dp[i] = malloc(sizeof (int ) * 2);
|
||||||
|
}
|
||||||
|
// 0表示持有该股票所得最大,1表示不持有所得最大
|
||||||
|
dp[0][0] = -prices[0];
|
||||||
|
dp[0][1] = 0;
|
||||||
|
for (int i = 1; i < pricesSize; ++i) {
|
||||||
|
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
||||||
|
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
|
||||||
|
}
|
||||||
|
return dp[pricesSize - 1][1];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 贪心
|
||||||
|
|
||||||
|
```c
|
||||||
|
int maxProfit(int* prices, int pricesSize) {
|
||||||
|
if(pricesSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int result = 0;
|
||||||
|
for(int i = 1; i < pricesSize; i++){
|
||||||
|
// 如果今天股票价格大于昨天,代表有利润
|
||||||
|
if(prices[i] > prices[i - 1]){
|
||||||
|
result += prices[i] - prices[i - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
> 贪心
|
> 贪心
|
||||||
|
|
@ -416,3 +459,4 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -413,6 +413,34 @@ function maxProfit(prices: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define min(a, b) ((a) > (b) ? (b) : (a))
|
||||||
|
|
||||||
|
int maxProfit(int* prices, int pricesSize) {
|
||||||
|
int buy1 = prices[0], buy2 = prices[0];
|
||||||
|
int profit1 = 0, profit2 = 0;
|
||||||
|
for (int i = 0; i < pricesSize; ++i) {
|
||||||
|
// 寻找最低点买入
|
||||||
|
buy1 = min(buy1, prices[i]);
|
||||||
|
// 找到第一次交易的最大盈利,并不断维护这一最大值
|
||||||
|
profit1 = max(profit1, prices[i] - buy1);
|
||||||
|
|
||||||
|
// 寻找第二次交易的最低投资点,并且考虑前一次交易的成本
|
||||||
|
// 当前价格 - 第一次操作的盈利=新的投入成本(
|
||||||
|
// 为了让盈利最大,要寻找最小的成本)
|
||||||
|
buy2 = min(buy2, prices[i] - profit1);
|
||||||
|
// 第二次卖出后的盈利:当前价格减去成本,不断维护这一最大的总利润
|
||||||
|
profit2 = max(profit2, prices[i] - buy2);
|
||||||
|
}
|
||||||
|
return profit2;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
> 版本一
|
> 版本一
|
||||||
|
|
@ -465,4 +493,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ class Solution {
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
```
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
|
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
|
||||||
wordSet = set(wordList)
|
wordSet = set(wordList)
|
||||||
|
|
|
||||||
|
|
@ -561,6 +561,237 @@ function solve(board) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
dfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
|
||||||
|
func solve(board [][]byte) {
|
||||||
|
rows, cols := len(board), len(board[0])
|
||||||
|
// 列
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
if board[i][0] == 'O' {
|
||||||
|
dfs(board, i, 0)
|
||||||
|
}
|
||||||
|
if board[i][cols-1] == 'O' {
|
||||||
|
dfs(board, i, cols-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 行
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if board[0][j] == 'O' {
|
||||||
|
dfs(board, 0, j)
|
||||||
|
}
|
||||||
|
if board[rows-1][j] == 'O' {
|
||||||
|
dfs(board, rows-1, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, r := range board {
|
||||||
|
for j, c := range r {
|
||||||
|
if c == 'A' {
|
||||||
|
r[j] = 'O'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if c == 'O' {
|
||||||
|
r[j] = 'X'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dfs(board [][]byte, i, j int) {
|
||||||
|
board[i][j] = 'A'
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := i+d[0], j+d[1]
|
||||||
|
if x < 0 || x >= len(board) || y < 0 || y >= len(board[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if board[x][y] == 'O' {
|
||||||
|
dfs(board, x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
|
||||||
|
func solve(board [][]byte) {
|
||||||
|
rows, cols := len(board), len(board[0])
|
||||||
|
// 列
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
if board[i][0] == 'O' {
|
||||||
|
bfs(board, i, 0)
|
||||||
|
}
|
||||||
|
if board[i][cols-1] == 'O' {
|
||||||
|
bfs(board, i, cols-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 行
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if board[0][j] == 'O' {
|
||||||
|
bfs(board, 0, j)
|
||||||
|
}
|
||||||
|
if board[rows-1][j] == 'O' {
|
||||||
|
bfs(board, rows-1, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, r := range board {
|
||||||
|
for j, c := range r {
|
||||||
|
if c == 'A' {
|
||||||
|
r[j] = 'O'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if c == 'O' {
|
||||||
|
r[j] = 'X'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func bfs(board [][]byte, i, j int) {
|
||||||
|
queue := [][]int{{i, j}}
|
||||||
|
board[i][j] = 'A'
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := cur[0]+d[0], cur[1]+d[1]
|
||||||
|
if x < 0 || x >= len(board) || y < 0 || y >= len(board[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if board[x][y] == 'O' {
|
||||||
|
board[x][y] = 'A'
|
||||||
|
queue = append(queue, []int{x, y})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rust
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
impl Solution {
|
||||||
|
const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)];
|
||||||
|
pub fn solve(board: &mut Vec<Vec<char>>) {
|
||||||
|
let (rows, cols) = (board.len(), board[0].len());
|
||||||
|
// 列
|
||||||
|
for i in 0..rows {
|
||||||
|
if board[i][0] == 'O' {
|
||||||
|
Self::dfs(board, i, 0);
|
||||||
|
}
|
||||||
|
if board[i][cols - 1] == 'O' {
|
||||||
|
Self::dfs(board, i, cols - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//行
|
||||||
|
for j in 0..cols {
|
||||||
|
if board[0][j] == 'O' {
|
||||||
|
Self::dfs(board, 0, j);
|
||||||
|
}
|
||||||
|
if board[rows - 1][j] == 'O' {
|
||||||
|
Self::dfs(board, rows - 1, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for v in board.iter_mut() {
|
||||||
|
for c in v.iter_mut() {
|
||||||
|
if *c == 'A' {
|
||||||
|
*c = 'O';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if *c == 'O' {
|
||||||
|
*c = 'X';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dfs(board: &mut [Vec<char>], i: usize, j: usize) {
|
||||||
|
board[i][j] = 'A';
|
||||||
|
for (d1, d2) in Self::DIRECTIONS {
|
||||||
|
let (x, y) = (i as isize + d1, j as isize + d2);
|
||||||
|
if x < 0 || x >= board.len() as isize || y < 0 || y >= board[0].len() as isize {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (x, y) = (x as usize, y as usize);
|
||||||
|
if board[x][y] == 'O' {
|
||||||
|
Self::dfs(board, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
impl Solution {
|
||||||
|
const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)];
|
||||||
|
pub fn solve(board: &mut Vec<Vec<char>>) {
|
||||||
|
let (rows, cols) = (board.len(), board[0].len());
|
||||||
|
// 列
|
||||||
|
for i in 0..rows {
|
||||||
|
if board[i][0] == 'O' {
|
||||||
|
Self::bfs(board, i, 0);
|
||||||
|
}
|
||||||
|
if board[i][cols - 1] == 'O' {
|
||||||
|
Self::bfs(board, i, cols - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//行
|
||||||
|
for j in 0..cols {
|
||||||
|
if board[0][j] == 'O' {
|
||||||
|
Self::bfs(board, 0, j);
|
||||||
|
}
|
||||||
|
if board[rows - 1][j] == 'O' {
|
||||||
|
Self::bfs(board, rows - 1, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for v in board.iter_mut() {
|
||||||
|
for c in v.iter_mut() {
|
||||||
|
if *c == 'A' {
|
||||||
|
*c = 'O';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if *c == 'O' {
|
||||||
|
*c = 'X';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bfs(board: &mut [Vec<char>], i: usize, j: usize) {
|
||||||
|
let mut queue = VecDeque::from([(i, j)]);
|
||||||
|
board[i][j] = 'A';
|
||||||
|
while let Some((i, j)) = queue.pop_front() {
|
||||||
|
for (d1, d2) in Self::DIRECTIONS {
|
||||||
|
let (x, y) = (i as isize + d1, j as isize + d2);
|
||||||
|
if x < 0 || x >= board.len() as isize || y < 0 || y >= board[0].len() as isize {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (x, y) = (x as usize, y as usize);
|
||||||
|
if board[x][y] == 'O' {
|
||||||
|
board[x][y] = 'A';
|
||||||
|
queue.push_back((x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
|
|
|
||||||
|
|
@ -498,6 +498,33 @@ function wordBreak(s: string, wordDict: string[]): boolean {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool wordBreak(char* s, char** wordDict, int wordDictSize) {
|
||||||
|
int len = strlen(s);
|
||||||
|
// 初始化
|
||||||
|
bool dp[len + 1];
|
||||||
|
memset(dp, false, sizeof (dp));
|
||||||
|
dp[0] = true;
|
||||||
|
for (int i = 1; i < len + 1; ++i) {
|
||||||
|
for(int j = 0; j < wordDictSize; j++){
|
||||||
|
int wordLen = strlen(wordDict[j]);
|
||||||
|
// 分割点是由i和字典单词长度决定
|
||||||
|
int k = i - wordLen;
|
||||||
|
if(k < 0){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 这里注意要限制长度,故用strncmp
|
||||||
|
dp[i] = (dp[k] && !strncmp(s + k, wordDict[j], wordLen)) || dp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[len];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -521,4 +548,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -973,7 +973,7 @@ char * reverseWords(char * s){
|
||||||
```
|
```
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
```C# LINQ高级方法
|
```csharp LINQ高级方法
|
||||||
public string ReverseWords(string s) {
|
public string ReverseWords(string s) {
|
||||||
return string.Join(' ', s.Trim().Split(' ',StringSplitOptions.RemoveEmptyEntries).Reverse());
|
return string.Join(' ', s.Trim().Split(' ',StringSplitOptions.RemoveEmptyEntries).Reverse());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -474,6 +474,34 @@ function maxProfit(k: number, prices: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int maxProfit(int k, int* prices, int pricesSize) {
|
||||||
|
if(pricesSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dp[pricesSize][2 * k + 1];
|
||||||
|
memset(dp, 0, sizeof(int) * pricesSize * (2 * k + 1));
|
||||||
|
for (int j = 1; j < 2 * k; j += 2) {
|
||||||
|
dp[0][j] = -prices[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1;i < pricesSize; i++) {//枚举股票
|
||||||
|
for (int j = 0; j < 2 * k - 1; j += 2) { //更新每一次买入卖出
|
||||||
|
dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
|
||||||
|
dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[pricesSize - 1][2 * k];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -529,3 +557,4 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -315,6 +315,31 @@ function rob(nums: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int rob(int* nums, int numsSize) {
|
||||||
|
if(numsSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(numsSize == 1){
|
||||||
|
return nums[0];
|
||||||
|
}
|
||||||
|
// dp初始化
|
||||||
|
int dp[numsSize];
|
||||||
|
dp[0] = nums[0];
|
||||||
|
dp[1] = max(nums[0], nums[1]);
|
||||||
|
for(int i = 2; i < numsSize; i++){
|
||||||
|
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
|
||||||
|
}
|
||||||
|
return dp[numsSize - 1];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -339,3 +364,4 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,9 @@ class Solution {
|
||||||
|
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
BFS solution
|
BFS solution
|
||||||
|
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
@ -240,6 +242,7 @@ class Solution:
|
||||||
|
|
||||||
```
|
```
|
||||||
### JavaScript
|
### JavaScript
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var numIslands = function (grid) {
|
var numIslands = function (grid) {
|
||||||
let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向
|
let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向
|
||||||
|
|
@ -321,11 +324,53 @@ function numIslands2(grid: string[][]): number {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
|
||||||
|
func numIslands(grid [][]byte) int {
|
||||||
|
res := 0
|
||||||
|
|
||||||
|
visited := make([][]bool, len(grid))
|
||||||
|
for i := 0; i < len(grid); i++ {
|
||||||
|
visited[i] = make([]bool, len(grid[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, rows := range grid {
|
||||||
|
for j, v := range rows {
|
||||||
|
if v == '1' && !visited[i][j] {
|
||||||
|
res++
|
||||||
|
bfs(grid, visited, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func bfs(grid [][]byte, visited [][]bool, i, j int) {
|
||||||
|
queue := [][2]int{{i, j}}
|
||||||
|
visited[i][j] = true // 标记已访问,循环中标记会导致重复
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := cur[0]+d[0], cur[1]+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if grid[x][y] == '1' && !visited[x][y] {
|
||||||
|
visited[x][y] = true
|
||||||
|
queue = append(queue, [2]int{x, y})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
impl Solution {
|
impl Solution {
|
||||||
const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)];
|
const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)];
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
|
在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
|
||||||
|
|
||||||
那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。
|
那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。
|
||||||
|
|
||||||
### 深度优先搜索
|
### 深度优先搜索
|
||||||
|
|
||||||
|
|
@ -389,50 +389,41 @@ function numIslands(grid: string[][]): number {
|
||||||
### Go
|
### Go
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
|
||||||
func numIslands(grid [][]byte) int {
|
func numIslands(grid [][]byte) int {
|
||||||
// 用1标记已访问
|
res := 0
|
||||||
visited := make([][]int, len(grid))
|
|
||||||
for i := 0; i < len(visited); i++{
|
|
||||||
visited[i] = make([]int, len(grid[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
var bfs func(x, y int)
|
visited := make([][]bool, len(grid))
|
||||||
bfs = func(x, y int){
|
for i := 0; i < len(grid); i++ {
|
||||||
stack := make([][]int, 0)
|
visited[i] = make([]bool, len(grid[0]))
|
||||||
stack = append(stack, []int{x, y})
|
}
|
||||||
moveX := []int{1, -1, 0, 0}
|
|
||||||
moveY := []int{0, 0, 1, -1}
|
|
||||||
|
|
||||||
for len(stack) != 0{
|
for i, rows := range grid {
|
||||||
node := stack[len(stack) - 1]
|
for j, v := range rows {
|
||||||
stack = stack[:len(stack) - 1]
|
if v == '1' && !visited[i][j] {
|
||||||
|
res++
|
||||||
|
dfs(grid, visited, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < 4; i++{
|
return res
|
||||||
dx := moveX[i] + node[0]
|
}
|
||||||
dy := moveY[i] + node[1]
|
|
||||||
if dx < 0 || dx >= len(grid) || dy < 0 || dy >= len(grid[0]) || visited[dx][dy] == 1{
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
visited[dx][dy] = 1
|
|
||||||
if grid[dx][dy] == '1'{
|
|
||||||
stack = append(stack, []int{dx,dy})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result := 0
|
func dfs(grid [][]byte, visited [][]bool, i, j int) {
|
||||||
for i := 0; i < len(grid); i++{
|
visited[x][y] = true
|
||||||
for j := 0; j < len(grid[0]); j++{
|
for _, d := range DIRECTIONS {
|
||||||
if visited[i][j] == 0 && grid[i][j] == '1'{
|
x, y := i+d[0], j+d[1]
|
||||||
bfs(i, j)
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
visited[i][j] = 1
|
continue
|
||||||
result++
|
}
|
||||||
}
|
if grid[x][y] == '1' && !visited[x][y] {
|
||||||
}
|
dfs(grid, visited, x, y)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -308,6 +308,34 @@ function robRange(nums: number[], start: number, end: number): number {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
// 198.打家劫舍的逻辑
|
||||||
|
int robRange(int* nums, int start, int end, int numsSize) {
|
||||||
|
if (end == start) return nums[start];
|
||||||
|
int dp[numsSize];
|
||||||
|
dp[start] = nums[start];
|
||||||
|
dp[start + 1] = max(nums[start], nums[start + 1]);
|
||||||
|
for (int i = start + 2; i <= end; i++) {
|
||||||
|
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
|
||||||
|
}
|
||||||
|
return dp[end];
|
||||||
|
}
|
||||||
|
|
||||||
|
int rob(int* nums, int numsSize) {
|
||||||
|
if (numsSize == 0) return 0;
|
||||||
|
if (numsSize == 1) return nums[0];
|
||||||
|
int result1 = robRange(nums, 0, numsSize - 2, numsSize); // 情况二
|
||||||
|
int result2 = robRange(nums, 1, numsSize - 1, numsSize); // 情况三
|
||||||
|
return max(result1, result2);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -343,4 +371,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -868,7 +868,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public int CountNodes(TreeNode root)
|
public int CountNodes(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1046,6 +1046,8 @@ class MyStack() {
|
||||||
|
|
||||||
### C#:
|
### C#:
|
||||||
|
|
||||||
|
> 双队列
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class MyStack {
|
public class MyStack {
|
||||||
Queue<int> queue1;
|
Queue<int> queue1;
|
||||||
|
|
@ -1080,6 +1082,54 @@ public class MyStack {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> 单队列
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/*
|
||||||
|
* @lc app=leetcode id=225 lang=csharp
|
||||||
|
* 版本二:单队列
|
||||||
|
* [225] Implement Stack using Queues
|
||||||
|
*/
|
||||||
|
|
||||||
|
// @lc code=start
|
||||||
|
public class MyStack {
|
||||||
|
Queue<int> myQueue;
|
||||||
|
public MyStack() {
|
||||||
|
myQueue = new Queue<int>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Push(int x) {
|
||||||
|
myQueue.Enqueue(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
//使用一个队列实现
|
||||||
|
public int Pop() {
|
||||||
|
//一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
|
||||||
|
for (var i = 0; i < myQueue.Count-1; i++)
|
||||||
|
{
|
||||||
|
myQueue.Enqueue(myQueue.Dequeue());
|
||||||
|
}
|
||||||
|
return myQueue.Dequeue();
|
||||||
|
}
|
||||||
|
|
||||||
|
//复用Pop()的代码
|
||||||
|
public int Top() {
|
||||||
|
int res = Pop();
|
||||||
|
myQueue.Enqueue(res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Empty() {
|
||||||
|
return (myQueue.Count == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @lc code=end
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### PHP:
|
### PHP:
|
||||||
|
|
||||||
> 双队列
|
> 双队列
|
||||||
|
|
@ -1203,3 +1253,4 @@ impl MyStack {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -298,7 +298,7 @@ class Solution:
|
||||||
return self.traversal(root, p, q)
|
return self.traversal(root, p, q)
|
||||||
```
|
```
|
||||||
|
|
||||||
迭代法(版本二)精简
|
递归法(版本二)精简
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def lowestCommonAncestor(self, root, p, q):
|
def lowestCommonAncestor(self, root, p, q):
|
||||||
|
|
@ -521,7 +521,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
|
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
|
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
|
||||||
{
|
{
|
||||||
if (root == null || root == p || root == q) return root;
|
if (root == null || root == p || root == q) return root;
|
||||||
|
|
|
||||||
|
|
@ -901,7 +901,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public IList<string> BinaryTreePaths(TreeNode root)
|
public IList<string> BinaryTreePaths(TreeNode root)
|
||||||
{
|
{
|
||||||
List<int> path = new();
|
List<int> path = new();
|
||||||
|
|
|
||||||
|
|
@ -389,6 +389,30 @@ function numSquares(n: number): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define min(a, b) ((a) > (b) ? (b) : (a))
|
||||||
|
|
||||||
|
int numSquares(int n) {
|
||||||
|
int* dp = (int*)malloc(sizeof(int) * (n + 1));
|
||||||
|
for (int j = 0; j < n + 1; j++) {
|
||||||
|
dp[j] = INT_MAX;
|
||||||
|
}
|
||||||
|
dp[0] = 0;
|
||||||
|
// 遍历背包
|
||||||
|
for (int i = 0; i <= n; ++i) {
|
||||||
|
// 遍历物品
|
||||||
|
for (int j = 1; j * j <= i; ++j) {
|
||||||
|
dp[i] = min(dp[i - j * j] + 1, dp[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[n];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -439,4 +463,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -288,6 +288,36 @@ function lengthOfLIS(nums: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int lengthOfLIS(int* nums, int numsSize) {
|
||||||
|
if(numsSize <= 1){
|
||||||
|
return numsSize;
|
||||||
|
}
|
||||||
|
int dp[numsSize];
|
||||||
|
for(int i = 0; i < numsSize; i++){
|
||||||
|
dp[i]=1;
|
||||||
|
}
|
||||||
|
int result = 1;
|
||||||
|
for (int i = 1; i < numsSize; ++i) {
|
||||||
|
for (int j = 0; j < i; ++j) {
|
||||||
|
if(nums[i] > nums[j]){
|
||||||
|
dp[i] = max(dp[i], dp[j] + 1);
|
||||||
|
}
|
||||||
|
if(dp[i] > result){
|
||||||
|
result = dp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -311,4 +341,3 @@ pub fn length_of_lis(nums: Vec<i32>) -> i32 {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -457,6 +457,40 @@ function maxProfit(prices: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态一:持有股票状态(今天买入股票,
|
||||||
|
* 或者是之前就买入了股票然后没有操作,一直持有)
|
||||||
|
* 不持有股票状态,这里就有两种卖出股票状态
|
||||||
|
* 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。
|
||||||
|
* 或者是前一天就是卖出股票状态,一直没操作)
|
||||||
|
* 状态三:今天卖出股票
|
||||||
|
* 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
|
||||||
|
|
||||||
|
*/
|
||||||
|
int maxProfit(int* prices, int pricesSize) {
|
||||||
|
if(pricesSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int dp[pricesSize][4];
|
||||||
|
memset(dp, 0, sizeof (int ) * pricesSize * 4);
|
||||||
|
dp[0][0] = -prices[0];
|
||||||
|
for (int i = 1; i < pricesSize; ++i) {
|
||||||
|
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]));
|
||||||
|
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
|
||||||
|
dp[i][2] = dp[i - 1][0] + prices[i];
|
||||||
|
dp[i][3] = dp[i - 1][2];
|
||||||
|
}
|
||||||
|
return max(dp[pricesSize - 1][1], max(dp[pricesSize - 1][2], dp[pricesSize - 1][3]));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -486,4 +520,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -352,6 +352,35 @@ func min(a, b int) int {
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define min(a, b) ((a) > (b) ? (b) : (a))
|
||||||
|
|
||||||
|
int coinChange(int* coins, int coinsSize, int amount) {
|
||||||
|
int* dp = (int*)malloc(sizeof(int) * (amount + 1));
|
||||||
|
for (int j = 0; j < amount + 1; j++) {
|
||||||
|
dp[j] = INT_MAX;
|
||||||
|
}
|
||||||
|
dp[0] = 0;
|
||||||
|
// 遍历背包
|
||||||
|
for(int i = 0; i <= amount; i++){
|
||||||
|
// 遍历物品
|
||||||
|
for(int j = 0; j < coinsSize; j++){
|
||||||
|
if(i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX){
|
||||||
|
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dp[amount] == INT_MAX){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return dp[amount];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
@ -474,4 +503,3 @@ function coinChange(coins: number[], amount: number): number {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -449,34 +449,37 @@ class Solution:
|
||||||
```
|
```
|
||||||
回溯 使用字典
|
回溯 使用字典
|
||||||
```python
|
```python
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
class Solution:
|
class Solution:
|
||||||
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
|
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
|
||||||
targets = defaultdict(list) # 构建机场字典
|
self.adj = {}
|
||||||
for ticket in tickets:
|
|
||||||
targets[ticket[0]].append(ticket[1])
|
|
||||||
for airport in targets:
|
|
||||||
targets[airport].sort() # 对目的地列表进行排序
|
|
||||||
|
|
||||||
path = ["JFK"] # 起始机场为"JFK"
|
# sort by the destination alphabetically
|
||||||
self.backtracking(targets, path, len(tickets))
|
# 根据航班每一站的重点字母顺序排序
|
||||||
return path
|
tickets.sort(key=lambda x:x[1])
|
||||||
|
|
||||||
def backtracking(self, targets, path, ticketNum):
|
# get all possible connection for each destination
|
||||||
if len(path) == ticketNum + 1:
|
# 罗列每一站的下一个可选项
|
||||||
return True # 找到有效行程
|
for u,v in tickets:
|
||||||
|
if u in self.adj: self.adj[u].append(v)
|
||||||
|
else: self.adj[u] = [v]
|
||||||
|
|
||||||
airport = path[-1] # 当前机场
|
# 从JFK出发
|
||||||
destinations = targets[airport] # 当前机场可以到达的目的地列表
|
self.result = []
|
||||||
for i, dest in enumerate(destinations):
|
self.dfs("JFK") # start with JFK
|
||||||
targets[airport].pop(i) # 标记已使用的机票
|
|
||||||
path.append(dest) # 添加目的地到路径
|
return self.result[::-1] # reverse to get the result
|
||||||
if self.backtracking(targets, path, ticketNum):
|
|
||||||
return True # 找到有效行程
|
def dfs(self, s):
|
||||||
targets[airport].insert(i, dest) # 回溯,恢复机票
|
# if depart city has flight and the flight can go to another city
|
||||||
path.pop() # 移除目的地
|
while s in self.adj and len(self.adj[s]) > 0:
|
||||||
return False # 没有找到有效行程
|
# 找到s能到哪里,选能到的第一个机场
|
||||||
|
v = self.adj[s][0] # we go to the 1 choice of the city
|
||||||
|
# 在之后的可选项机场中去掉这个机场
|
||||||
|
self.adj[s].pop(0) # get rid of this choice since we used it
|
||||||
|
# 从当前的新出发点开始
|
||||||
|
self.dfs(v) # we start from the new airport
|
||||||
|
|
||||||
|
self.result.append(s) # after append, it will back track to last node, thus the result list is in reversed order
|
||||||
|
|
||||||
```
|
```
|
||||||
回溯 使用字典 逆序
|
回溯 使用字典 逆序
|
||||||
|
|
|
||||||
|
|
@ -490,6 +490,33 @@ function robNode(node: TreeNode | null): MaxValueArr {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
int *robTree(struct TreeNode *node) {
|
||||||
|
int* amounts = (int*) malloc(sizeof(int) * 2);
|
||||||
|
memset(amounts, 0, sizeof(int) * 2);
|
||||||
|
if(node == NULL){
|
||||||
|
return amounts;
|
||||||
|
}
|
||||||
|
int * left = robTree(node->left);
|
||||||
|
int * right = robTree(node->right);
|
||||||
|
// 偷当前节点
|
||||||
|
amounts[1] = node->val + left[0] + right[0];
|
||||||
|
// 不偷当前节点
|
||||||
|
amounts[0] = max(left[0], left[1]) + max(right[0], right[1]);
|
||||||
|
return amounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rob(struct TreeNode* root) {
|
||||||
|
int * dp = robTree(root);
|
||||||
|
// 0代表不偷当前节点可以获得的最大值,1表示偷当前节点可以获取的最大值
|
||||||
|
return max(dp[0], dp[1]);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
动态规划:
|
动态规划:
|
||||||
|
|
@ -523,4 +550,3 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -496,6 +496,25 @@ class Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int IntegerBreak(int n)
|
||||||
|
{
|
||||||
|
int[] dp = new int[n + 1];
|
||||||
|
dp[2] = 1;
|
||||||
|
for (int i = 3; i <= n; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= i / 2; j++)
|
||||||
|
{
|
||||||
|
dp[i] = Math.Max(dp[i],Math.Max(j*(i-j),j*dp[i-j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,34 @@ func topKFrequent(nums []int, k int) []int {
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
|
||||||
|
解法一:
|
||||||
|
Leetcode 提供了优先队列的库,具体文档可以参见 [@datastructures-js/priority-queue](https://github.com/datastructures-js/priority-queue/blob/v5/README.md)。
|
||||||
|
|
||||||
|
```js
|
||||||
|
var topKFrequent = function (nums, k) {
|
||||||
|
const map = new Map();
|
||||||
|
const res = [];
|
||||||
|
//使用 map 统计元素出现频率
|
||||||
|
for (const num of nums) {
|
||||||
|
map.set(num, (map.get(num) || 0) + 1);
|
||||||
|
}
|
||||||
|
//创建小顶堆
|
||||||
|
const heap = new PriorityQueue({
|
||||||
|
compare: (a, b) => a.value - b.value
|
||||||
|
})
|
||||||
|
for (const [key, value] of map) {
|
||||||
|
heap.enqueue({ key, value });
|
||||||
|
if (heap.size() > k) heap.dequeue();
|
||||||
|
}
|
||||||
|
//处理输出
|
||||||
|
while (heap.size()) res.push(heap.dequeue().key);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
解法二:
|
||||||
|
手写实现优先队列
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// js 没有堆 需要自己构造
|
// js 没有堆 需要自己构造
|
||||||
class Heap {
|
class Heap {
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,8 @@ class Solution:
|
||||||
|
|
||||||
### Go:
|
### Go:
|
||||||
|
|
||||||
|
(版本一)使用字典和集合
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func intersection(nums1 []int, nums2 []int) []int {
|
func intersection(nums1 []int, nums2 []int) []int {
|
||||||
set:=make(map[int]struct{},0) // 用map模拟set
|
set:=make(map[int]struct{},0) // 用map模拟set
|
||||||
|
|
@ -251,6 +253,28 @@ func intersection(nums1 []int, nums2 []int) []int {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
(版本二)使用数组
|
||||||
|
|
||||||
|
```go
|
||||||
|
func intersection(nums1 []int, nums2 []int) []int {
|
||||||
|
count1 := make([]int, 1001, 1001)
|
||||||
|
count2 := make([]int, 1001, 1001)
|
||||||
|
res := make([]int, 0)
|
||||||
|
for _, v := range nums1 {
|
||||||
|
count1[v] = 1
|
||||||
|
}
|
||||||
|
for _, v := range nums2 {
|
||||||
|
count2[v] = 1
|
||||||
|
}
|
||||||
|
for i := 0; i <= 1000; i++ {
|
||||||
|
if count1[i] + count2[i] == 2 {
|
||||||
|
res = append(res, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
|
|
||||||
|
|
@ -312,10 +312,52 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
int combinationSum4(int* nums, int numsSize, int target) {
|
||||||
|
int dp[target + 1];
|
||||||
|
memset(dp, 0, sizeof (dp ));
|
||||||
|
dp[0] = 1;
|
||||||
|
for(int i = 0; i <= target; i++){
|
||||||
|
for(int j = 0; j < numsSize; j++){
|
||||||
|
if(i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]){
|
||||||
|
dp[i] += dp[i - nums[j]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[target];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int CombinationSum4(int[] nums, int target)
|
||||||
|
{
|
||||||
|
int[] dp = new int[target + 1];
|
||||||
|
dp[0] = 1;
|
||||||
|
for (int i = 0; i <= target; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < nums.Length; j++)
|
||||||
|
{
|
||||||
|
if (i >= nums[j] && dp[i] < int.MaxValue - dp[i - nums[j]])
|
||||||
|
{
|
||||||
|
dp[i] += dp[i - nums[j]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[target];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ class Solution:
|
||||||
|
|
||||||
(版本六)使用count(简单易懂)
|
(版本六)使用count(简单易懂)
|
||||||
|
|
||||||
```python3
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
|
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
|
||||||
for char in ransomNote:
|
for char in ransomNote:
|
||||||
|
|
@ -445,6 +445,25 @@ public bool CanConstruct(string ransomNote, string magazine) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool canConstruct(char* ransomNote, char* magazine) {
|
||||||
|
// 定义哈希映射数组
|
||||||
|
int hashmap[26] = {0};
|
||||||
|
// 对magazine中字符计数
|
||||||
|
while (*magazine != '\0') hashmap[*magazine++ % 26]++;
|
||||||
|
// 遍历ransomNote,对应的字符自减,小于0说明该字符magazine没有或不足够表示
|
||||||
|
while (*ransomNote != '\0') hashmap[*ransomNote++ % 26]--;
|
||||||
|
// 如果数组中存在负数,说明ransomNote不能由magazine里面的字符构成
|
||||||
|
for (int i = 0; i < 26; i++) {
|
||||||
|
if (hashmap[i] < 0) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -652,7 +652,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public int SumOfLeftLeaves(TreeNode root)
|
public int SumOfLeftLeaves(TreeNode root)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -396,6 +396,29 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int[][] ReconstructQueue(int[][] people)
|
||||||
|
{
|
||||||
|
Array.Sort(people, (a, b) =>
|
||||||
|
{
|
||||||
|
if (a[0] == b[0])
|
||||||
|
{
|
||||||
|
return a[1] - b[1];
|
||||||
|
}
|
||||||
|
return b[0] - a[0];
|
||||||
|
});
|
||||||
|
var res = new List<int[]>();
|
||||||
|
for (int i = 0; i < people.Length; i++)
|
||||||
|
{
|
||||||
|
res.Insert(people[i][1], people[i]);
|
||||||
|
}
|
||||||
|
return res.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|
|
||||||
|
|
@ -726,7 +726,35 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public bool CanPartition(int[] nums)
|
||||||
|
{
|
||||||
|
int sum = 0;
|
||||||
|
int[] dp = new int[10001];
|
||||||
|
foreach (int num in nums)
|
||||||
|
{
|
||||||
|
sum += num;
|
||||||
|
}
|
||||||
|
if (sum % 2 == 1) return false;
|
||||||
|
int tartget = sum / 2;
|
||||||
|
for (int i = 0; i < nums.Length; i++)
|
||||||
|
{
|
||||||
|
for (int j = tartget; j >= nums[i]; j--)
|
||||||
|
{
|
||||||
|
dp[j] = Math.Max(dp[j], dp[j - nums[i]] + nums[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dp[tartget] == tartget)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
|
|
|
||||||
|
|
@ -562,7 +562,213 @@ function pacificAtlantic(heights) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### go
|
||||||
|
|
||||||
|
dfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
|
||||||
|
|
||||||
|
func pacificAtlantic(heights [][]int) [][]int {
|
||||||
|
res := make([][]int, 0)
|
||||||
|
pacific := make([][]bool, len(heights))
|
||||||
|
atlantic := make([][]bool, len(heights))
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
pacific[i] = make([]bool, len(heights[0]))
|
||||||
|
atlantic[i] = make([]bool, len(heights[0]))
|
||||||
|
}
|
||||||
|
// 列
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
dfs(heights, pacific, i, 0)
|
||||||
|
dfs(heights, atlantic, i, len(heights[0])-1)
|
||||||
|
}
|
||||||
|
// 行
|
||||||
|
for j := 0; j < len(heights[0]); j++ {
|
||||||
|
dfs(heights, pacific, 0, j)
|
||||||
|
dfs(heights, atlantic, len(heights)-1, j)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
for j := 0; j < len(heights[0]); j++ {
|
||||||
|
if pacific[i][j] && atlantic[i][j] {
|
||||||
|
res = append(res, []int{i, j})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func dfs(heights [][]int, visited [][]bool, i, j int) {
|
||||||
|
visited[i][j] = true
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := i+d[0], j+d[1]
|
||||||
|
if x < 0 || x >= len(heights) || y < 0 || y >= len(heights[0]) || heights[i][j] > heights[x][y] || visited[x][y] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
dfs(heights, visited, x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
|
||||||
|
|
||||||
|
func pacificAtlantic(heights [][]int) [][]int {
|
||||||
|
res := make([][]int, 0)
|
||||||
|
pacific := make([][]bool, len(heights))
|
||||||
|
atlantic := make([][]bool, len(heights))
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
pacific[i] = make([]bool, len(heights[0]))
|
||||||
|
atlantic[i] = make([]bool, len(heights[0]))
|
||||||
|
}
|
||||||
|
// 列
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
bfs(heights, pacific, i, 0)
|
||||||
|
bfs(heights, atlantic, i, len(heights[0])-1)
|
||||||
|
}
|
||||||
|
// 行
|
||||||
|
for j := 0; j < len(heights[0]); j++ {
|
||||||
|
bfs(heights, pacific, 0, j)
|
||||||
|
bfs(heights, atlantic, len(heights)-1, j)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(heights); i++ {
|
||||||
|
for j := 0; j < len(heights[0]); j++ {
|
||||||
|
if pacific[i][j] && atlantic[i][j] {
|
||||||
|
res = append(res, []int{i, j})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func bfs(heights [][]int, visited [][]bool, i, j int) {
|
||||||
|
queue := make([][]int, 0)
|
||||||
|
queue = append(queue, []int{i, j})
|
||||||
|
visited[i][j] = true
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := cur[0]+d[0], cur[1]+d[1]
|
||||||
|
if x < 0 || x >= len(heights) || y < 0 || y >= len(heights[0]) || heights[cur[0]][cur[1]] > heights[x][y] || visited[x][y] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
queue = append(queue, []int{x, y})
|
||||||
|
visited[x][y] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rust
|
||||||
|
|
||||||
|
dfs:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
impl Solution {
|
||||||
|
const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)];
|
||||||
|
pub fn pacific_atlantic(heights: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
|
||||||
|
let (m, n) = (heights.len(), heights[0].len());
|
||||||
|
let mut res = vec![];
|
||||||
|
let (mut pacific, mut atlantic) = (vec![vec![false; n]; m], vec![vec![false; n]; m]);
|
||||||
|
|
||||||
|
// 列
|
||||||
|
for i in 0..m {
|
||||||
|
Self::dfs(&heights, &mut pacific, i, 0);
|
||||||
|
Self::dfs(&heights, &mut atlantic, i, n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for j in 0..n {
|
||||||
|
Self::dfs(&heights, &mut pacific, 0, j);
|
||||||
|
Self::dfs(&heights, &mut atlantic, m - 1, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..m {
|
||||||
|
for j in 0..n {
|
||||||
|
if pacific[i][j] && atlantic[i][j] {
|
||||||
|
res.push(vec![i as i32, j as i32]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dfs(heights: &[Vec<i32>], visited: &mut [Vec<bool>], i: usize, j: usize) {
|
||||||
|
visited[i][j] = true;
|
||||||
|
for (dx, dy) in Self::DIRECTIONS {
|
||||||
|
let (x, y) = (i as isize + dx, j as isize + dy);
|
||||||
|
if x < 0 || x >= heights.len() as isize || y < 0 || y >= heights[0].len() as isize {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (x, y) = (x as usize, y as usize);
|
||||||
|
if !visited[x][y] && heights[x][y] >= heights[i][j] {
|
||||||
|
Self::dfs(heights, visited, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)];
|
||||||
|
pub fn pacific_atlantic(heights: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
|
||||||
|
let (m, n) = (heights.len(), heights[0].len());
|
||||||
|
let mut res = vec![];
|
||||||
|
let (mut pacific, mut atlantic) = (vec![vec![false; n]; m], vec![vec![false; n]; m]);
|
||||||
|
|
||||||
|
// 列
|
||||||
|
for i in 0..m {
|
||||||
|
Self::bfs(&heights, &mut pacific, i, 0);
|
||||||
|
Self::bfs(&heights, &mut atlantic, i, n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for j in 0..n {
|
||||||
|
Self::bfs(&heights, &mut pacific, 0, j);
|
||||||
|
Self::bfs(&heights, &mut atlantic, m - 1, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..m {
|
||||||
|
for j in 0..n {
|
||||||
|
if pacific[i][j] && atlantic[i][j] {
|
||||||
|
res.push(vec![i as i32, j as i32]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bfs(heights: &[Vec<i32>], visited: &mut [Vec<bool>], i: usize, j: usize) {
|
||||||
|
let mut queue = VecDeque::from([(i, j)]);
|
||||||
|
visited[i][j] = true;
|
||||||
|
while let Some((i, j)) = queue.pop_front() {
|
||||||
|
for (dx, dy) in Self::DIRECTIONS {
|
||||||
|
let (x, y) = (i as isize + dx, j as isize + dy);
|
||||||
|
if x < 0 || x >= heights.len() as isize || y < 0 || y >= heights[0].len() as isize {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (x, y) = (x as usize, y as usize);
|
||||||
|
if !visited[x][y] && heights[x][y] >= heights[i][j] {
|
||||||
|
queue.push_back((x, y));
|
||||||
|
visited[x][y] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -423,7 +423,7 @@ object Solution {
|
||||||
|
|
||||||
```Rust
|
```Rust
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn erase_overlap_intervals(intervals: Vec<Vec<i32>>) -> i32 {
|
pub fn erase_overlap_intervals(mut intervals: Vec<Vec<i32>>) -> i32 {
|
||||||
if intervals.is_empty() {
|
if intervals.is_empty() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -441,6 +441,57 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 按照区间右边界排序
|
||||||
|
int cmp(const void * var1, const void * var2){
|
||||||
|
return (*(int **) var1)[1] - (*(int **) var2)[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) {
|
||||||
|
if(intervalsSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
qsort(intervals, intervalsSize, sizeof (int *), cmp);
|
||||||
|
// 记录非重叠的区间数量
|
||||||
|
int count = 1;
|
||||||
|
// 记录区间分割点
|
||||||
|
int end = intervals[0][1];
|
||||||
|
for(int i = 1; i < intervalsSize; i++){
|
||||||
|
if(end <= intervals[i][0]){
|
||||||
|
end = intervals[i][1];
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return intervalsSize - count;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int EraseOverlapIntervals(int[][] intervals)
|
||||||
|
{
|
||||||
|
if (intervals.Length == 0) return 0;
|
||||||
|
Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1]));
|
||||||
|
int res = 1, end = intervals[0][1];
|
||||||
|
for (int i = 1; i < intervals.Length; i++)
|
||||||
|
{
|
||||||
|
if (end <= intervals[i][0])
|
||||||
|
{
|
||||||
|
end = intervals[i][1];
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return intervals.Length - res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
TreeNode* deleteNode(TreeNode* root, int key)
|
TreeNode* deleteNode(TreeNode* root, int key)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ TreeNode* deleteNode(TreeNode* root, int key)
|
||||||
|
|
||||||
遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了
|
遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root == nullptr) return root;
|
if (root == nullptr) return root;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -106,7 +106,7 @@ if (root->val == key) {
|
||||||
|
|
||||||
这里相当于把新的节点返回给上一层,上一层就要用 root->left 或者 root->right接住,代码如下:
|
这里相当于把新的节点返回给上一层,上一层就要用 root->left 或者 root->right接住,代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root->val > key) root->left = deleteNode(root->left, key);
|
if (root->val > key) root->left = deleteNode(root->left, key);
|
||||||
if (root->val < key) root->right = deleteNode(root->right, key);
|
if (root->val < key) root->right = deleteNode(root->right, key);
|
||||||
return root;
|
return root;
|
||||||
|
|
@ -772,7 +772,7 @@ impl Solution {
|
||||||
### C#
|
### C#
|
||||||
|
|
||||||
> 递归法:
|
> 递归法:
|
||||||
```C#
|
```csharp
|
||||||
public TreeNode DeleteNode(TreeNode root, int key) {
|
public TreeNode DeleteNode(TreeNode root, int key) {
|
||||||
// 第一种情况:没找到删除的节点,遍历到空节点直接返回了
|
// 第一种情况:没找到删除的节点,遍历到空节点直接返回了
|
||||||
if (root == null) return null;
|
if (root == null) return null;
|
||||||
|
|
|
||||||
|
|
@ -332,6 +332,24 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int FindMinArrowShots(int[][] points)
|
||||||
|
{
|
||||||
|
if (points.Length == 0) return 0;
|
||||||
|
Array.Sort(points, (a, b) => a[0].CompareTo(b[0]));
|
||||||
|
int count = 1;
|
||||||
|
for (int i = 1; i < points.Length; i++)
|
||||||
|
{
|
||||||
|
if (points[i][0] > points[i - 1][1]) count++;
|
||||||
|
else points[i][1] = Math.Min(points[i][1], points[i - 1][1]);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -412,6 +412,75 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 哈希表大小
|
||||||
|
const int HASH_SIZE = 101;
|
||||||
|
|
||||||
|
typedef struct node {
|
||||||
|
int val;
|
||||||
|
int count;
|
||||||
|
struct node *next;
|
||||||
|
} node, *HashMap;
|
||||||
|
|
||||||
|
// 哈希表插入
|
||||||
|
void hash_insert(HashMap hashmap[], int val) {
|
||||||
|
int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE, count = 0;
|
||||||
|
node *p = hashmap[idx];
|
||||||
|
while (p->next != NULL) {
|
||||||
|
p = p->next;
|
||||||
|
if (p->val == val) {
|
||||||
|
(p->count)++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node *new = malloc(sizeof(node));
|
||||||
|
new->val = val;
|
||||||
|
new->count = 1;
|
||||||
|
new->next = NULL;
|
||||||
|
p->next = new;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 哈希表查找
|
||||||
|
int hash_search(HashMap hashmap[], int val) {
|
||||||
|
int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE;
|
||||||
|
node *p = hashmap[idx];
|
||||||
|
while (p->next != NULL) {
|
||||||
|
p = p->next;
|
||||||
|
if (p->val == val) return p->count;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){
|
||||||
|
// 初始化哈希表
|
||||||
|
HashMap hashmap[HASH_SIZE];
|
||||||
|
for (int i = 0; i < HASH_SIZE; i++) {
|
||||||
|
hashmap[i] = malloc(sizeof(node));
|
||||||
|
hashmap[i]->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统计两个数组元素之和的负值和出现的次数,放到哈希表中
|
||||||
|
int count = 0, num;
|
||||||
|
for (int i = 0; i < nums1Size; i++) {
|
||||||
|
for(int j = 0; j < nums2Size; j++) {
|
||||||
|
num = - nums1[i] - nums2[j];
|
||||||
|
hash_insert(hashmap, num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统计另外两个数组元素之和,查找哈希表中对应元素的出现次数,加入总次数
|
||||||
|
for (int i = 0; i < nums3Size; i++) {
|
||||||
|
for(int j = 0; j < nums4Size; j++) {
|
||||||
|
num = nums3[i] + nums4[j];
|
||||||
|
count += hash_search(hashmap, num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
```
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
|
|
|
||||||
|
|
@ -229,7 +229,7 @@ func findContentChildren(g []int, s []int) int {
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
pub fn find_content_children(mut children: Vec<i32>, mut cookie: Vec<i32>) -> i32 {
|
pub fn find_content_children(mut children: Vec<i32>, mut cookies: Vec<i32>) -> i32 {
|
||||||
children.sort();
|
children.sort();
|
||||||
cookies.sort();
|
cookies.sort();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -682,7 +682,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 前缀表不减一
|
// 前缀表不减一
|
||||||
public bool RepeatedSubstringPattern(string s)
|
public bool RepeatedSubstringPattern(string s)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -533,6 +533,67 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
## C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int findMaxForm(char** strs, int strsSize, int m, int n) {
|
||||||
|
int dp[m + 1][n + 1];
|
||||||
|
memset(dp, 0, sizeof (int ) * (m + 1) * (n + 1));
|
||||||
|
for(int i = 0; i < strsSize; i++){
|
||||||
|
// 统计0和1的数量
|
||||||
|
int count0 = 0;
|
||||||
|
int count1 = 0;
|
||||||
|
char *str = strs[i];
|
||||||
|
while (*str != '\0'){
|
||||||
|
if(*str == '0'){
|
||||||
|
count0++;
|
||||||
|
} else{
|
||||||
|
count1++;
|
||||||
|
}
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
for(int j = m; j >= count0; j--){
|
||||||
|
for(int k = n; k >= count1; k--){
|
||||||
|
dp[j][k] = max(dp[j][k], dp[j - count0][k - count1] + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[m][n];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int FindMaxForm(string[] strs, int m, int n)
|
||||||
|
{
|
||||||
|
int[,] dp = new int[m + 1, n + 1];
|
||||||
|
foreach (string str in strs)
|
||||||
|
{
|
||||||
|
int zero = 0, one = 0;
|
||||||
|
foreach (char c in str)
|
||||||
|
{
|
||||||
|
if (c == '0') zero++;
|
||||||
|
else one++;
|
||||||
|
}
|
||||||
|
for (int i = m; i >= zero; i--)
|
||||||
|
{
|
||||||
|
for (int j = n; j >= one; j--)
|
||||||
|
{
|
||||||
|
dp[i, j] = Math.Max(dp[i, j], dp[i - zero, j - one] + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[m, n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -585,6 +585,70 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
## C
|
||||||
|
|
||||||
|
```c
|
||||||
|
int getSum(int * nums, int numsSize){
|
||||||
|
int sum = 0;
|
||||||
|
for(int i = 0; i < numsSize; i++){
|
||||||
|
sum += nums[i];
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
int findTargetSumWays(int* nums, int numsSize, int target) {
|
||||||
|
int sum = getSum(nums, numsSize);
|
||||||
|
int diff = sum - target;
|
||||||
|
// 两种情况不满足
|
||||||
|
if(diff < 0 || diff % 2 != 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int bagSize = diff / 2;
|
||||||
|
int dp[numsSize + 1][bagSize + 1];
|
||||||
|
dp[0][0] = 1;
|
||||||
|
for(int i = 1; i <= numsSize; i++){
|
||||||
|
int num = nums[i - 1];
|
||||||
|
for(int j = 0; j <= bagSize; j++){
|
||||||
|
dp[i][j] = dp[i - 1][j];
|
||||||
|
if(j >= num){
|
||||||
|
dp[i][j] += dp[i - 1][j - num];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[numsSize][bagSize];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int FindTargetSumWays(int[] nums, int target)
|
||||||
|
{
|
||||||
|
int sum = 0;
|
||||||
|
foreach (int num in nums)
|
||||||
|
{
|
||||||
|
sum += num;
|
||||||
|
}
|
||||||
|
if (Math.Abs(target) > sum) return 0;
|
||||||
|
if ((sum + target) % 2 == 1) return 0;
|
||||||
|
int bagSize = (sum + target) / 2;
|
||||||
|
int[] dp = new int[bagSize + 1];
|
||||||
|
dp[0] = 1;
|
||||||
|
for (int i = 0; i < nums.Length; i++)
|
||||||
|
{
|
||||||
|
for (int j = bagSize; j >= nums[i]; j--)
|
||||||
|
{
|
||||||
|
dp[j] += dp[j - nums[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[bagSize];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,7 @@ class Solution {
|
||||||
### Python3
|
### Python3
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
# 版本一
|
||||||
class Solution:
|
class Solution:
|
||||||
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
|
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
|
||||||
result = [-1]*len(nums1)
|
result = [-1]*len(nums1)
|
||||||
|
|
@ -273,6 +274,26 @@ class Solution:
|
||||||
stack.pop()
|
stack.pop()
|
||||||
stack.append(i)
|
stack.append(i)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# 版本二
|
||||||
|
class Solution:
|
||||||
|
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
|
||||||
|
stack = []
|
||||||
|
# 创建答案数组
|
||||||
|
ans = [-1] * len(nums1)
|
||||||
|
for i in range(len(nums2)):
|
||||||
|
while len(stack) > 0 and nums2[i] > nums2[stack[-1]]:
|
||||||
|
# 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常
|
||||||
|
if nums2[stack[-1]] in nums1:
|
||||||
|
# 锁定 num1 检索的 index
|
||||||
|
index = nums1.index(nums2[stack[-1]])
|
||||||
|
# 更新答案数组
|
||||||
|
ans[index] = nums2[i]
|
||||||
|
# 弹出小元素
|
||||||
|
# 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了
|
||||||
|
stack.pop()
|
||||||
|
stack.append(i)
|
||||||
|
return ans
|
||||||
```
|
```
|
||||||
|
|
||||||
### Go
|
### Go
|
||||||
|
|
|
||||||
|
|
@ -1010,7 +1010,7 @@ pub fn find_mode(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -170,7 +170,6 @@ class Solution {
|
||||||
### Python:
|
### Python:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# 方法 1:
|
|
||||||
class Solution:
|
class Solution:
|
||||||
def nextGreaterElements(self, nums: List[int]) -> List[int]:
|
def nextGreaterElements(self, nums: List[int]) -> List[int]:
|
||||||
dp = [-1] * len(nums)
|
dp = [-1] * len(nums)
|
||||||
|
|
@ -181,26 +180,6 @@ class Solution:
|
||||||
stack.pop()
|
stack.pop()
|
||||||
stack.append(i%len(nums))
|
stack.append(i%len(nums))
|
||||||
return dp
|
return dp
|
||||||
|
|
||||||
# 方法 2:
|
|
||||||
class Solution:
|
|
||||||
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
|
|
||||||
stack = []
|
|
||||||
# 创建答案数组
|
|
||||||
ans = [-1] * len(nums1)
|
|
||||||
for i in range(len(nums2)):
|
|
||||||
while len(stack) > 0 and nums2[i] > nums2[stack[-1]]:
|
|
||||||
# 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常
|
|
||||||
if nums2[stack[-1]] in nums1:
|
|
||||||
# 锁定 num1 检索的 index
|
|
||||||
index = nums1.index(nums2[stack[-1]])
|
|
||||||
# 更新答案数组
|
|
||||||
ans[index] = nums2[i]
|
|
||||||
# 弹出小元素
|
|
||||||
# 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了
|
|
||||||
stack.pop()
|
|
||||||
stack.append(i)
|
|
||||||
return ans
|
|
||||||
```
|
```
|
||||||
### Go:
|
### Go:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -439,7 +439,7 @@ object Solution {
|
||||||
|
|
||||||
动态规划:
|
动态规划:
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public int Fib(int n)
|
public int Fib(int n)
|
||||||
|
|
@ -459,7 +459,7 @@ public class Solution
|
||||||
|
|
||||||
递归:
|
递归:
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public int Fib(int n)
|
public int Fib(int n)
|
||||||
|
|
|
||||||
|
|
@ -685,7 +685,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
//递归
|
//递归
|
||||||
int maxDepth = -1;
|
int maxDepth = -1;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
@ -716,9 +716,55 @@ public void Traversal(TreeNode root, int depth)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
```csharp
|
||||||
|
/*
|
||||||
|
* @lc app=leetcode id=513 lang=csharp
|
||||||
|
* 迭代法
|
||||||
|
* [513] Find Bottom Left Tree Value
|
||||||
|
*/
|
||||||
|
|
||||||
|
// @lc code=start
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int FindBottomLeftValue(TreeNode root)
|
||||||
|
{
|
||||||
|
Queue<TreeNode> que = new Queue<TreeNode>();
|
||||||
|
|
||||||
|
if (root != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ans = 0;
|
||||||
|
while (que.Count != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
int size = que.Count;
|
||||||
|
for (var i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
var curNode = que.Peek();
|
||||||
|
que.Dequeue();
|
||||||
|
if(i == 0){
|
||||||
|
ans = curNode.val;
|
||||||
|
}
|
||||||
|
if (curNode.left != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(curNode.left);
|
||||||
|
}
|
||||||
|
if (curNode.right != null)
|
||||||
|
{
|
||||||
|
que.Enqueue(curNode.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @lc code=end
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -224,20 +224,26 @@ class Solution {
|
||||||
// 二维dp数组版本,方便理解
|
// 二维dp数组版本,方便理解
|
||||||
class Solution {
|
class Solution {
|
||||||
public int change(int amount, int[] coins) {
|
public int change(int amount, int[] coins) {
|
||||||
int[][] dp = new int[coins.length][amount + 1];
|
int[][] dp = new int[coins.length][amount+1];
|
||||||
// 只有一种硬币的情况
|
|
||||||
for (int i = 0; i <= amount; i += coins[0]) {
|
// 初始化边界值
|
||||||
dp[0][i] = 1;
|
for(int i = 0; i < coins.length; i++){
|
||||||
|
// 第一列的初始值为1
|
||||||
|
dp[i][0] = 1;
|
||||||
}
|
}
|
||||||
for (int i = 1; i < coins.length; i++) {
|
for(int j = coins[0]; j <= amount; j++){
|
||||||
for (int j = 0; j <= amount; j++) {
|
// 初始化第一行
|
||||||
// 第i种硬币使用0~k次,求和
|
dp[0][j] += dp[0][j-coins[0]];
|
||||||
for (int k = 0; k * coins[i] <= j; k++) {
|
}
|
||||||
dp[i][j] += dp[i - 1][j - k * coins[i]];
|
|
||||||
}
|
for(int i = 1; i < coins.length; i++){
|
||||||
|
for(int j = 1; j <= amount; j++){
|
||||||
|
if(j < coins[i]) dp[i][j] = dp[i-1][j];
|
||||||
|
else dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return dp[coins.length - 1][amount];
|
|
||||||
|
return dp[coins.length-1][amount];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
@ -347,8 +353,50 @@ object Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
## C
|
||||||
|
|
||||||
|
```c
|
||||||
|
int change(int amount, int* coins, int coinsSize) {
|
||||||
|
int dp[amount + 1];
|
||||||
|
memset(dp, 0, sizeof (dp));
|
||||||
|
dp[0] = 1;
|
||||||
|
// 遍历物品
|
||||||
|
for(int i = 0; i < coinsSize; i++){
|
||||||
|
// 遍历背包
|
||||||
|
for(int j = coins[i]; j <= amount; j++){
|
||||||
|
dp[j] += dp[j - coins[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[amount];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int Change(int amount, int[] coins)
|
||||||
|
{
|
||||||
|
int[] dp = new int[amount + 1];
|
||||||
|
dp[0] = 1;
|
||||||
|
for (int i = 0; i < coins.Length; i++)
|
||||||
|
{
|
||||||
|
for (int j = coins[i]; j <= amount; j++)
|
||||||
|
{
|
||||||
|
if (j >= coins[i])
|
||||||
|
dp[j] += dp[j - coins[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[amount];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -648,7 +648,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -530,7 +530,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -789,7 +789,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public TreeNode MergeTrees(TreeNode root1, TreeNode root2)
|
public TreeNode MergeTrees(TreeNode root1, TreeNode root2)
|
||||||
{
|
{
|
||||||
if (root1 == null) return root2;
|
if (root1 == null) return root2;
|
||||||
|
|
|
||||||
|
|
@ -397,6 +397,7 @@ class Solution:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Go:
|
### Go:
|
||||||
|
> 动态规划:
|
||||||
|
|
||||||
```Go
|
```Go
|
||||||
func countSubstrings(s string) int {
|
func countSubstrings(s string) int {
|
||||||
|
|
@ -422,6 +423,47 @@ func countSubstrings(s string) int {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
> 动态规划:简洁版
|
||||||
|
```Go
|
||||||
|
func countSubstrings(s string) int {
|
||||||
|
res := 0
|
||||||
|
dp := make([][]bool, len(s))
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
dp[i] = make([]bool, len(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := len(s) - 1; i >= 0; i-- {
|
||||||
|
for j := i; j < len(s); j++ {
|
||||||
|
if s[i] == s[j] && (j-i <= 1 || dp[i+1][j-1]) {
|
||||||
|
res++
|
||||||
|
dp[i][j] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 双指针法:
|
||||||
|
```Go
|
||||||
|
func countSubstrings(s string) int {
|
||||||
|
extend := func(i, j int) int {
|
||||||
|
res := 0
|
||||||
|
for i >= 0 && j < len(s) && s[i] == s[j] {
|
||||||
|
i --
|
||||||
|
j ++
|
||||||
|
res ++
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
res := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
res += extend(i, i) // 以i为中心
|
||||||
|
res += extend(i, i+1) // 以i和i+1为中心
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Javascript:
|
### Javascript:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -583,7 +583,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
public TreeNode ConstructMaximumBinaryTree(int[] nums)
|
public TreeNode ConstructMaximumBinaryTree(int[] nums)
|
||||||
{
|
{
|
||||||
if (nums.Length == 0) return null;
|
if (nums.Length == 0) return null;
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ public:
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
TreeNode* trimBST(TreeNode* root, int low, int high)
|
TreeNode* trimBST(TreeNode* root, int low, int high)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -87,7 +87,7 @@ TreeNode* trimBST(TreeNode* root, int low, int high)
|
||||||
|
|
||||||
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
|
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root == nullptr ) return nullptr;
|
if (root == nullptr ) return nullptr;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -97,7 +97,7 @@ if (root == nullptr ) return nullptr;
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root->val < low) {
|
if (root->val < low) {
|
||||||
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
|
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
|
||||||
return right;
|
return right;
|
||||||
|
|
@ -108,7 +108,7 @@ if (root->val < low) {
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root->val > high) {
|
if (root->val > high) {
|
||||||
TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
|
TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
|
||||||
return left;
|
return left;
|
||||||
|
|
@ -119,7 +119,7 @@ if (root->val > high) {
|
||||||
|
|
||||||
最后返回root节点,代码如下:
|
最后返回root节点,代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
|
root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
|
||||||
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
|
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
|
||||||
return root;
|
return root;
|
||||||
|
|
@ -133,7 +133,7 @@ return root;
|
||||||
|
|
||||||
如下代码相当于把节点0的右孩子(节点2)返回给上一层,
|
如下代码相当于把节点0的右孩子(节点2)返回给上一层,
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root->val < low) {
|
if (root->val < low) {
|
||||||
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
|
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
|
||||||
return right;
|
return right;
|
||||||
|
|
@ -142,7 +142,7 @@ if (root->val < low) {
|
||||||
|
|
||||||
然后如下代码相当于用节点3的左孩子 把下一层返回的 节点0的右孩子(节点2) 接住。
|
然后如下代码相当于用节点3的左孩子 把下一层返回的 节点0的右孩子(节点2) 接住。
|
||||||
|
|
||||||
```
|
``` cpp
|
||||||
root->left = trimBST(root->left, low, high);
|
root->left = trimBST(root->left, low, high);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -568,7 +568,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public TreeNode TrimBST(TreeNode root, int low, int high)
|
public TreeNode TrimBST(TreeNode root, int low, int high)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,57 @@ function findLengthOfLCIS(nums: number[]): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
> 动态规划:
|
||||||
|
|
||||||
|
```c
|
||||||
|
int findLengthOfLCIS(int* nums, int numsSize) {
|
||||||
|
if(numsSize == 0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int dp[numsSize];
|
||||||
|
for(int i = 0; i < numsSize; i++){
|
||||||
|
dp[i] = 1;
|
||||||
|
}
|
||||||
|
int result = 1;
|
||||||
|
for (int i = 1; i < numsSize; ++i) {
|
||||||
|
if(nums[i] > nums[i - 1]){
|
||||||
|
dp[i] = dp[i - 1] + 1;
|
||||||
|
}
|
||||||
|
if(dp[i] > result){
|
||||||
|
result = dp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> 贪心:
|
||||||
|
|
||||||
|
```c
|
||||||
|
int findLengthOfLCIS(int* nums, int numsSize) {
|
||||||
|
int result = 1;
|
||||||
|
int count = 1;
|
||||||
|
if(numsSize == 0){
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
for (int i = 1; i < numsSize; ++i) {
|
||||||
|
if(nums[i] > nums[i - 1]){
|
||||||
|
count++;
|
||||||
|
} else{
|
||||||
|
count = 1;
|
||||||
|
}
|
||||||
|
if(count > result){
|
||||||
|
result = count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -432,4 +483,3 @@ function findLengthOfLCIS(nums: number[]): number {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ edges[2][0] = 2,edges[2][1] = 3,
|
||||||
|
|
||||||
搞清楚之后,我们如何统计入度呢?
|
搞清楚之后,我们如何统计入度呢?
|
||||||
|
|
||||||
即 edges[i][1] 表示的节点都是 箭头指向的节点,即这个几点有一个入度! (如果想统计出度,那么就是 edges[i][0])。
|
即 edges[i][1] 表示的节点都是 箭头指向的节点,即这个节点有一个入度! (如果想统计出度,那么就是 edges[i][0])。
|
||||||
|
|
||||||
所以,统计入度的代码如下:
|
所以,统计入度的代码如下:
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ for (int i = 0; i < n; i++) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两天边删哪一条都可以成为树,就删最后那一条。
|
前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两条边删哪一条都可以成为树,就删最后那一条。
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ if (vec.size() > 0) {
|
||||||
|
|
||||||
可以定义一个函数,代码如下:
|
可以定义一个函数,代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
// 在有向图里找到删除的那条边,使其变成树,返回值就是要删除的边
|
// 在有向图里找到删除的那条边,使其变成树,返回值就是要删除的边
|
||||||
vector<int> getRemoveEdge(const vector<vector<int>>& edges)
|
vector<int> getRemoveEdge(const vector<vector<int>>& edges)
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -428,6 +428,146 @@ var maxAreaOfIsland = function (grid) {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
dsf: 版本一
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
var count int = 0
|
||||||
|
|
||||||
|
func maxAreaOfIsland(grid [][]int) int {
|
||||||
|
res := 0
|
||||||
|
visited := make([][]bool, len(grid))
|
||||||
|
for i := 0; i < len(grid); i++ {
|
||||||
|
visited[i] = make([]bool, len(grid[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, rows := range grid {
|
||||||
|
for j, v := range rows {
|
||||||
|
if v == 1 && !visited[i][j] {
|
||||||
|
// 第一种写法,重制 count,必定有 1 个
|
||||||
|
count = 1
|
||||||
|
dfs(grid, visited, i, j)
|
||||||
|
res = max(res, count)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第一种写法
|
||||||
|
func dfs(grid [][]int, visited [][]bool, i, j int) {
|
||||||
|
visited[i][j] = true // 标记已访问,循环中未标记会导致重复
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := i+d[0], j+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if grid[x][y] == 1 && !visited[x][y] {
|
||||||
|
count++
|
||||||
|
dfs(grid, visited, x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
dfs:版本二
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
var count int = 0
|
||||||
|
|
||||||
|
func maxAreaOfIsland(grid [][]int) int {
|
||||||
|
res := 0
|
||||||
|
visited := make([][]bool, len(grid))
|
||||||
|
for i := 0; i < len(grid); i++ {
|
||||||
|
visited[i] = make([]bool, len(grid[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, rows := range grid {
|
||||||
|
for j, v := range rows {
|
||||||
|
if v == 1 && !visited[i][j] {
|
||||||
|
// 第二种写法
|
||||||
|
count = 0
|
||||||
|
dfs(grid, visited, i, j)
|
||||||
|
res = max(res, count)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第二种写法
|
||||||
|
func dfs(grid [][]int, visited [][]bool, i, j int) {
|
||||||
|
if visited[i][j] || grid[i][j] == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
visited[i][j] = true
|
||||||
|
count++
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := i+d[0], j+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dfs(grid, visited, x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
var count int = 0
|
||||||
|
|
||||||
|
func maxAreaOfIsland(grid [][]int) int {
|
||||||
|
res := 0
|
||||||
|
visited := make([][]bool, len(grid))
|
||||||
|
for i := 0; i < len(grid); i++ {
|
||||||
|
visited[i] = make([]bool, len(grid[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, rows := range grid {
|
||||||
|
for j, v := range rows {
|
||||||
|
if v == 1 && !visited[i][j] {
|
||||||
|
count = 0
|
||||||
|
bfs(grid, visited, i, j)
|
||||||
|
res = max(res, count)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// bfs
|
||||||
|
func bfs(grid [][]int, visited [][]bool, i, j int) {
|
||||||
|
visited[i][j] = true
|
||||||
|
count++
|
||||||
|
queue := [][2]int{{i, j}}
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := cur[0]+d[0], cur[1]+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if grid[x][y] == 1 && !visited[x][y] {
|
||||||
|
count++
|
||||||
|
queue = append(queue, [2]int{x, y})
|
||||||
|
visited[x][y] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -465,7 +465,7 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
// 递归
|
// 递归
|
||||||
public TreeNode SearchBST(TreeNode root, int val)
|
public TreeNode SearchBST(TreeNode root, int val)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
TreeNode* insertIntoBST(TreeNode* root, int val)
|
TreeNode* insertIntoBST(TreeNode* root, int val)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -69,7 +69,7 @@ TreeNode* insertIntoBST(TreeNode* root, int val)
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
TreeNode* node = new TreeNode(val);
|
TreeNode* node = new TreeNode(val);
|
||||||
return node;
|
return node;
|
||||||
|
|
@ -88,7 +88,7 @@ if (root == NULL) {
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (root->val > val) root->left = insertIntoBST(root->left, val);
|
if (root->val > val) root->left = insertIntoBST(root->left, val);
|
||||||
if (root->val < val) root->right = insertIntoBST(root->right, val);
|
if (root->val < val) root->right = insertIntoBST(root->right, val);
|
||||||
return root;
|
return root;
|
||||||
|
|
@ -120,7 +120,7 @@ public:
|
||||||
|
|
||||||
那么递归函数定义如下:
|
那么递归函数定义如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
TreeNode* parent; // 记录遍历节点的父节点
|
TreeNode* parent; // 记录遍历节点的父节点
|
||||||
void traversal(TreeNode* cur, int val)
|
void traversal(TreeNode* cur, int val)
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -1486,7 +1486,7 @@ impl MyLinkedList {
|
||||||
```
|
```
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
```C#
|
```csharp
|
||||||
class ListNode
|
class ListNode
|
||||||
{
|
{
|
||||||
public int val;
|
public int val;
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,29 @@ function maxProfit(prices: number[], fee: number): number {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
// dp[i][0] 表示第i天持有股票所省最多现金。
|
||||||
|
// dp[i][1] 表示第i天不持有股票所得最多现金
|
||||||
|
int maxProfit(int* prices, int pricesSize, int fee) {
|
||||||
|
int dp[pricesSize][2];
|
||||||
|
dp[0][0] = -prices[0];
|
||||||
|
dp[0][1] = 0;
|
||||||
|
for (int i = 1; i < pricesSize; ++i) {
|
||||||
|
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
||||||
|
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
|
||||||
|
}
|
||||||
|
return dp[pricesSize - 1][1];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rust:
|
### Rust:
|
||||||
|
|
||||||
**贪心**
|
**贪心**
|
||||||
|
|
||||||
```Rust
|
```Rust
|
||||||
|
|
@ -304,3 +326,4 @@ impl Solution {
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -560,10 +560,30 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) {
|
||||||
|
int dp[nums1Size + 1][nums2Size + 1];
|
||||||
|
memset(dp, 0, sizeof(dp));
|
||||||
|
int result = 0;
|
||||||
|
for (int i = 1; i <= nums1Size; ++i) {
|
||||||
|
for (int j = 1; j <= nums2Size; ++j) {
|
||||||
|
if(nums1[i - 1] == nums2[j - 1]){
|
||||||
|
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||||
|
}
|
||||||
|
if(dp[i][j] > result){
|
||||||
|
result = dp[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -392,9 +392,58 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
int monotoneIncreasingDigits(int n) {
|
||||||
|
char str[11];
|
||||||
|
// 将数字转换为字符串
|
||||||
|
sprintf(str, "%d", n);
|
||||||
|
int len = strlen(str);
|
||||||
|
int flag = strlen(str);
|
||||||
|
for(int i = len - 1; i > 0; i--){
|
||||||
|
if(str[i] < str[i - 1]){
|
||||||
|
str[i - 1]--;
|
||||||
|
flag = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = flag; i < len; i++){
|
||||||
|
str[i] = '9';
|
||||||
|
}
|
||||||
|
// 字符串转数字
|
||||||
|
return atoi(str);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int MonotoneIncreasingDigits(int n)
|
||||||
|
{
|
||||||
|
char[] s = n.ToString().ToCharArray();
|
||||||
|
int flag = s.Length;
|
||||||
|
for (int i = s.Length - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
if (s[i - 1] > s[i])
|
||||||
|
{
|
||||||
|
flag = i;
|
||||||
|
s[i - 1]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = flag; i < s.Length; i++)
|
||||||
|
{
|
||||||
|
s[i] = '9';
|
||||||
|
}
|
||||||
|
return int.Parse(new string(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -500,7 +500,7 @@ object Solution {
|
||||||
|
|
||||||
### C#
|
### C#
|
||||||
|
|
||||||
```c#
|
```csharp
|
||||||
public class Solution
|
public class Solution
|
||||||
{
|
{
|
||||||
public int MinCostClimbingStairs(int[] cost)
|
public int MinCostClimbingStairs(int[] cost)
|
||||||
|
|
|
||||||
|
|
@ -404,9 +404,65 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int* partitionLabels(char* s, int* returnSize) {
|
||||||
|
// 记录每个字符最远出现的位置
|
||||||
|
int last[26] = {0};
|
||||||
|
int len = strlen(s);
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
last[s[i] - 'a'] = i;
|
||||||
|
}
|
||||||
|
int left = 0, right = 0;
|
||||||
|
int * partition = malloc(sizeof (int ) * len);
|
||||||
|
// 初始化值
|
||||||
|
*returnSize = 0;
|
||||||
|
for(int i = 0; i < len; i++){
|
||||||
|
right = max(right, last[s[i] - 'a']);
|
||||||
|
// 到达最远位置,加入答案,并且更新左边下标
|
||||||
|
if(i == right){
|
||||||
|
partition[(*returnSize)++] = right - left + 1;
|
||||||
|
left = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return partition;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C#
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public IList<int> PartitionLabels(string s)
|
||||||
|
{
|
||||||
|
int[] location = new int[27];
|
||||||
|
for (int i = 0; i < s.Length; i++)
|
||||||
|
{
|
||||||
|
location[s[i] - 'a'] = i;
|
||||||
|
}
|
||||||
|
List<int> res = new List<int>();
|
||||||
|
int left = 0, right = 0;
|
||||||
|
for (int i = 0; i < s.Length; i++)
|
||||||
|
{
|
||||||
|
right = Math.Max(right, location[s[i] - 'a']);
|
||||||
|
if (i == right)
|
||||||
|
{
|
||||||
|
res.Add(right - left + 1);
|
||||||
|
left = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -348,6 +348,162 @@ class Solution:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
func largestIsland(grid [][]int) int {
|
||||||
|
dir := [][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}}
|
||||||
|
n := len(grid)
|
||||||
|
m := len(grid[0])
|
||||||
|
area := 0
|
||||||
|
visited := make([][]bool, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
visited[i] = make([]bool, m)
|
||||||
|
}
|
||||||
|
gridNum := make(map[int]int, 0) // 记录每一个岛屿的面积
|
||||||
|
mark := 2 // 记录每个岛屿的编号
|
||||||
|
isAllGrid := true
|
||||||
|
res := 0 // 标记是否整个地图都是陆地
|
||||||
|
|
||||||
|
var dfs func(grid [][]int, visited [][]bool, x, y, mark int)
|
||||||
|
dfs = func(grid [][]int, visited [][]bool, x, y, mark int) {
|
||||||
|
// 终止条件:访问过的节点 或者 遇到海水
|
||||||
|
if visited[x][y] || grid[x][y] == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
visited[x][y] = true // 标记访问过
|
||||||
|
grid[x][y] = mark // 给陆地标记新标签
|
||||||
|
area++
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
nextX := x + dir[i][0]
|
||||||
|
nextY := y + dir[i][1]
|
||||||
|
if nextX < 0 || nextX >= len(grid) || nextY < 0 || nextY >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dfs(grid, visited, nextX, nextY, mark)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := 0; j < m; j++ {
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
isAllGrid = false
|
||||||
|
}
|
||||||
|
if !visited[i][j] && grid[i][j] == 1 {
|
||||||
|
area = 0
|
||||||
|
dfs(grid, visited, i, j, mark) // 将与其链接的陆地都标记上 true
|
||||||
|
gridNum[mark] = area // 记录每一个岛屿的面积
|
||||||
|
mark++ // 更新下一个岛屿编号
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isAllGrid {
|
||||||
|
return n * m
|
||||||
|
}
|
||||||
|
// 根据添加陆地的位置,计算周边岛屿面积之和
|
||||||
|
visitedGrid := make(map[int]struct{}) // 标记访问过的岛屿
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := 0; j < m; j++ {
|
||||||
|
count := 1 // 记录连接之后的岛屿数量
|
||||||
|
visitedGrid = make(map[int]struct{}) // 每次使用时,清空
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
for k := 0; k < 4; k++ {
|
||||||
|
// 计算相邻坐标
|
||||||
|
nearI := i + dir[k][0]
|
||||||
|
nearJ := j + dir[k][1]
|
||||||
|
if nearI < 0 || nearI >= len(grid) || nearJ < 0 || nearJ >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 添加过的岛屿不要重复添加
|
||||||
|
if _, ok := visitedGrid[grid[nearI][nearJ]]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 把相邻四面的岛屿数量加起来
|
||||||
|
count += gridNum[grid[nearI][nearJ]]
|
||||||
|
// 标记该岛屿已经添加过
|
||||||
|
visitedGrid[grid[nearI][nearJ]] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res = max827(res, count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func max827(x, y int) int {
|
||||||
|
if x > y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### JavaScript
|
||||||
|
|
||||||
|
```JavaScript
|
||||||
|
|
||||||
|
var largestIsland = function(grid) {
|
||||||
|
let res = 0;
|
||||||
|
const m = grid.length;
|
||||||
|
const n = grid[0].length;
|
||||||
|
const tag = new Array(n).fill().map(_ => new Array(m).fill(0));
|
||||||
|
const area = new Map();
|
||||||
|
const dir = [[0,1],[0,-1],[1,0],[-1,0]];
|
||||||
|
const dfs = (grid,tag,x,y,mark) => {
|
||||||
|
let res = 1;
|
||||||
|
tag[x][y] = mark;
|
||||||
|
for(let i = 0; i < dir.length; i++) {
|
||||||
|
let nextX = x + dir[i][0];
|
||||||
|
let nextY = y + dir[i][1];
|
||||||
|
if(nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(grid[nextX][nextY] === 1 && tag[nextX][nextY] === 0) {
|
||||||
|
res += dfs(grid,tag,nextX,nextY,mark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
let mark = 2;
|
||||||
|
//将岛屿用mark标记
|
||||||
|
for(let i = 0; i < m; i++) {
|
||||||
|
for(let j = 0; j < n; j++) {
|
||||||
|
if(grid[i][j] === 1 && tag[i][j] === 0) {
|
||||||
|
area.set(mark,dfs(grid,tag,i,j,mark));
|
||||||
|
res = Math.max(res,area.get(mark));
|
||||||
|
mark++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//将一个非岛屿格子变为岛屿
|
||||||
|
for(let i = 0; i < m; i++) {
|
||||||
|
for(let j = 0; j < n; j++) {
|
||||||
|
if(grid[i][j] === 0) {
|
||||||
|
let z = 1;
|
||||||
|
const connected = new Set();
|
||||||
|
for(let k = 0; k < dir.length; k++) {
|
||||||
|
let nextX = i + dir[k][0];
|
||||||
|
let nextY = j + dir[k][1];
|
||||||
|
if(nextX < 0 || nextX >= m || nextY < 0 || nextY >= n || tag[nextX][nextY] === 0 || connected.has(tag[nextX][nextY])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
z += area.get(tag[nextX][nextY]);
|
||||||
|
connected.add(tag[nextX][nextY]);
|
||||||
|
}
|
||||||
|
res = Math.max(res,z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
|
|
|
||||||
|
|
@ -369,8 +369,44 @@ class Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
简化分支版本:
|
||||||
|
|
||||||
|
```java
|
||||||
|
class Solution {
|
||||||
|
static int ans;
|
||||||
|
public int minCameraCover(TreeNode root) {
|
||||||
|
ans = 0; // 初始化
|
||||||
|
if(f(root) == 0) ans ++;
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
// 定义 f 函数有三种返回值情况
|
||||||
|
// 0:表示 x 节点没有被相机监控,只能依靠父节点放相机
|
||||||
|
// 1:表示 x 节点被相机监控,但相机不是放在自身节点上
|
||||||
|
// 2:表示 x 节点被相机监控,但相机放在自身节点上
|
||||||
|
public static int f(TreeNode x) {
|
||||||
|
if(x == null) return 1; // 空树认为被监控,但没有相机
|
||||||
|
// 左右递归到最深处
|
||||||
|
int l = f(x.left);
|
||||||
|
int r = f(x.right);
|
||||||
|
// 有任意一个子节点为空,就需要当前节点放相机,不然以后没机会
|
||||||
|
if(l == 0 || r == 0) {
|
||||||
|
ans ++; // 放相机
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
// 贪心策略,左右子树都被监控,且没有监控到当前节点,
|
||||||
|
// 那么最有利的情况就是将相机放置在当前节点父节点上,
|
||||||
|
// 因为这样能多监控可能的子树节点和父父节点
|
||||||
|
if(l == 1 && r == 1) return 0;
|
||||||
|
// 剩下情况就是左右子树有可能为 2,即当前节点被监控
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
贪心(版本一)
|
贪心(版本一)
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
|
|
@ -726,10 +762,34 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int res = 0;
|
||||||
|
public int MinCameraCover(TreeNode root)
|
||||||
|
{
|
||||||
|
if (Traversal(root) == 0) res++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
public int Traversal(TreeNode cur)
|
||||||
|
{
|
||||||
|
if (cur == null) return 2;
|
||||||
|
int left = Traversal(cur.left);
|
||||||
|
int right = Traversal(cur.right);
|
||||||
|
if (left == 2 && right == 2) return 0;
|
||||||
|
else if (left == 0 || right == 0)
|
||||||
|
{
|
||||||
|
res++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -327,37 +327,45 @@ var commonChars = function(words) {
|
||||||
### GO
|
### GO
|
||||||
|
|
||||||
```golang
|
```golang
|
||||||
func commonChars(words []string) []string {
|
func commonChars(A []string) []string {
|
||||||
length:=len(words)
|
var result []string
|
||||||
fre:=make([][]int,0)//统计每个字符串的词频
|
if len(A) == 0 {
|
||||||
res:=make([]string,0)
|
return result
|
||||||
//统计词频
|
}
|
||||||
for i:=0;i<length;i++{
|
|
||||||
var row [26]int//存放该字符串的词频
|
hash := make([]int, 26) // 用来统计所有字符串里字符出现的最小频率
|
||||||
for j:=0;j<len(words[i]);j++{
|
for _, c := range A[0] { // 用第一个字符串给hash初始化
|
||||||
row[words[i][j]-97]++
|
hash[c-'a']++
|
||||||
}
|
}
|
||||||
fre=append(fre,row[:])
|
|
||||||
}
|
for i := 1; i < len(A); i++ {
|
||||||
//查找一列的最小值
|
hashOtherStr := make([]int, 26) // 统计除第一个字符串外字符的出现频率
|
||||||
for j:=0;j<len(fre[0]);j++{
|
for _, c := range A[i] {
|
||||||
pre:=fre[0][j]
|
hashOtherStr[c-'a']++
|
||||||
for i:=0;i<len(fre);i++{
|
}
|
||||||
pre=min(pre,fre[i][j])
|
// 更新hash,保证hash里统计26个字符在所有字符串里出现的最小次数
|
||||||
}
|
for k := 0; k < 26; k++ {
|
||||||
//将该字符添加到结果集(按照次数)
|
hash[k] = min(hash[k], hashOtherStr[k])
|
||||||
tmpString:=string(j+97)
|
}
|
||||||
for i:=0;i<pre;i++{
|
}
|
||||||
res=append(res,tmpString)
|
|
||||||
}
|
// 将hash统计的字符次数,转成输出形式
|
||||||
}
|
for i := 0; i < 26; i++ {
|
||||||
return res
|
for hash[i] > 0 {
|
||||||
|
s := string('a' + i) // rune -> string
|
||||||
|
result = append(result, s)
|
||||||
|
hash[i]--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
func min(a,b int)int{
|
|
||||||
if a>b{
|
func min(a, b int) int {
|
||||||
return b
|
if a < b {
|
||||||
}
|
return a
|
||||||
return a
|
}
|
||||||
|
return b
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -491,6 +491,120 @@ class Solution:
|
||||||
return ans
|
return ans
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
dfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
var count int = 0
|
||||||
|
|
||||||
|
func numEnclaves(grid [][]int) int {
|
||||||
|
rows, cols := len(grid), len(grid[0])
|
||||||
|
// 行
|
||||||
|
for i := range grid[0] {
|
||||||
|
if grid[0][i] == 1 {
|
||||||
|
dfs(grid, 0, i)
|
||||||
|
}
|
||||||
|
if grid[rows-1][i] == 1 {
|
||||||
|
dfs(grid, rows-1, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 列
|
||||||
|
for j := range grid {
|
||||||
|
if grid[j][0] == 1 {
|
||||||
|
dfs(grid, j, 0)
|
||||||
|
}
|
||||||
|
if grid[j][cols-1] == 1 {
|
||||||
|
dfs(grid, j, cols-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count = 0
|
||||||
|
for i := range grid {
|
||||||
|
for j := range grid[0] {
|
||||||
|
if grid[i][j] == 1 {
|
||||||
|
dfs(grid, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func dfs(grid [][]int, i, j int) {
|
||||||
|
grid[i][j] = 0
|
||||||
|
count++
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := i+d[0], j+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if grid[x][y] == 1 {
|
||||||
|
dfs(grid, x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
bfs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
|
||||||
|
var count int = 0
|
||||||
|
|
||||||
|
func numEnclaves(grid [][]int) int {
|
||||||
|
rows, cols := len(grid), len(grid[0])
|
||||||
|
// 行
|
||||||
|
for i := range grid[0] {
|
||||||
|
if grid[0][i] == 1 {
|
||||||
|
bfs(grid, 0, i)
|
||||||
|
}
|
||||||
|
if grid[rows-1][i] == 1 {
|
||||||
|
bfs(grid, rows-1, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 列
|
||||||
|
for j := range grid {
|
||||||
|
if grid[j][0] == 1 {
|
||||||
|
bfs(grid, j, 0)
|
||||||
|
}
|
||||||
|
if grid[j][cols-1] == 1 {
|
||||||
|
bfs(grid, j, cols-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count = 0
|
||||||
|
for i := range grid {
|
||||||
|
for j := range grid[0] {
|
||||||
|
if grid[i][j] == 1 {
|
||||||
|
bfs(grid, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func bfs(grid [][]int, i, j int) {
|
||||||
|
queue := [][]int{}
|
||||||
|
queue = append(queue, []int{i, j})
|
||||||
|
grid[i][j] = 0
|
||||||
|
count++
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
for _, d := range DIRECTIONS {
|
||||||
|
x, y := cur[0]+d[0], cur[1]+d[1]
|
||||||
|
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if grid[x][y] == 1 {
|
||||||
|
count++
|
||||||
|
queue = append(queue, []int{x, y})
|
||||||
|
grid[x][y] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
dfs:
|
dfs:
|
||||||
|
|
|
||||||
|
|
@ -472,6 +472,30 @@ impl Solution {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
### C#
|
||||||
|
```csharp
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public int LastStoneWeightII(int[] stones)
|
||||||
|
{
|
||||||
|
int[] dp = new int[15001];
|
||||||
|
int sum = 0;
|
||||||
|
foreach (int stone in stones)
|
||||||
|
{
|
||||||
|
sum += stone;
|
||||||
|
}
|
||||||
|
int target = sum / 2;
|
||||||
|
for (int i = 0; i < stones.Length; i++)
|
||||||
|
{
|
||||||
|
for (int j = target; j >= stones[i]; j--)
|
||||||
|
{
|
||||||
|
dp[j] = Math.Max(dp[j], dp[j - stones[i]] + stones[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum - 2 * dp[target];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -376,10 +376,32 @@ impl Solution {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int longestCommonSubsequence(char* text1, char* text2) {
|
||||||
|
int text1Len = strlen(text1);
|
||||||
|
int text2Len = strlen(text2);
|
||||||
|
int dp[text1Len + 1][text2Len + 1];
|
||||||
|
memset(dp, 0, sizeof (dp));
|
||||||
|
for (int i = 1; i <= text1Len; ++i) {
|
||||||
|
for (int j = 1; j <= text2Len; ++j) {
|
||||||
|
if(text1[i - 1] == text2[j - 1]){
|
||||||
|
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||||
|
} else{
|
||||||
|
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[text1Len][text2Len];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,26 +8,24 @@
|
||||||
|
|
||||||
[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/)
|
[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/)
|
||||||
|
|
||||||
有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
|
有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
|
||||||
|
|
||||||
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
|
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
|
||||||
|
|
||||||
给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
|
给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
提示:
|
提示:
|
||||||
|
|
||||||
* 1 <= n <= 2 * 10^5
|
- 1 <= n <= 2 \* 10^5
|
||||||
* 0 <= edges.length <= 2 * 10^5
|
- 0 <= edges.length <= 2 \* 10^5
|
||||||
* edges[i].length == 2
|
- edges[i].length == 2
|
||||||
* 0 <= ui, vi <= n - 1
|
- 0 <= ui, vi <= n - 1
|
||||||
* ui != vi
|
- ui != vi
|
||||||
* 0 <= start, end <= n - 1
|
- 0 <= start, end <= n - 1
|
||||||
* 不存在双向边
|
- 不存在双向边
|
||||||
* 不存在指向顶点自身的边
|
- 不存在指向顶点自身的边
|
||||||
|
|
||||||
## 思路
|
## 思路
|
||||||
|
|
||||||
|
|
@ -70,7 +68,7 @@ void join(int u, int v) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
以上模板中,只要修改 n 大小就可以,本题n不会超过2 * 10^5。
|
以上模板中,只要修改 n 大小就可以,本题 n 不会超过 2 \* 10^5。
|
||||||
|
|
||||||
并查集主要有三个功能。
|
并查集主要有三个功能。
|
||||||
|
|
||||||
|
|
@ -86,7 +84,7 @@ void join(int u, int v) {
|
||||||
|
|
||||||
此时我们就可以直接套用并查集模板。
|
此时我们就可以直接套用并查集模板。
|
||||||
|
|
||||||
使用join(int u, int v)将每条边加入到并查集。
|
使用 join(int u, int v)将每条边加入到并查集。
|
||||||
|
|
||||||
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
||||||
|
|
||||||
|
|
@ -191,7 +189,7 @@ class Solution {
|
||||||
|
|
||||||
### Python:
|
### Python:
|
||||||
|
|
||||||
PYTHON并查集解法如下:
|
PYTHON 并查集解法如下:
|
||||||
|
|
||||||
```PYTHON
|
```PYTHON
|
||||||
class Solution:
|
class Solution:
|
||||||
|
|
@ -206,6 +204,85 @@ class Solution:
|
||||||
return find(source) == find(destination)
|
return find(source) == find(destination)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Javascript:
|
||||||
|
|
||||||
|
Javascript 并查集解法如下:
|
||||||
|
|
||||||
|
```Javascript
|
||||||
|
class unionF{
|
||||||
|
constructor(n){
|
||||||
|
this.count = n
|
||||||
|
this.roots = new Array(n).fill(0).map((item,index)=>index)
|
||||||
|
}
|
||||||
|
|
||||||
|
findRoot(x){
|
||||||
|
if(this.roots[x]!==x){
|
||||||
|
this.roots[x] = this.findRoot(this.roots[x])
|
||||||
|
}
|
||||||
|
return this.roots[x]
|
||||||
|
}
|
||||||
|
|
||||||
|
union(x,y){
|
||||||
|
const rx = this.findRoot(x)
|
||||||
|
const ry = this.findRoot(y)
|
||||||
|
this.roots[rx] = ry
|
||||||
|
this.count--
|
||||||
|
}
|
||||||
|
|
||||||
|
isConnected(x,y){
|
||||||
|
return this.findRoot(x)===this.findRoot(y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var validPath = function(n, edges, source, destination) {
|
||||||
|
const UF = new unionF(n)
|
||||||
|
for(const [s,t] of edges){
|
||||||
|
UF.union(s,t)
|
||||||
|
}
|
||||||
|
return UF.isConnected(source,destination)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Javascript 双向 bfs 解法如下:
|
||||||
|
|
||||||
|
```Javascript
|
||||||
|
var validPath = function(n, edges, source, destination) {
|
||||||
|
const graph = new Array(n).fill(0).map(()=>[])
|
||||||
|
for(const [s,t] of edges){
|
||||||
|
graph[s].push(t)
|
||||||
|
graph[t].push(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
const visited = new Array(n).fill(false)
|
||||||
|
function bfs(start,end,graph){
|
||||||
|
const startq = [start]
|
||||||
|
const endq = [end]
|
||||||
|
while(startq.length&&endq.length){
|
||||||
|
const slen = startq.length
|
||||||
|
for(let i = 0;i<slen;i++){
|
||||||
|
const scur = startq.shift()
|
||||||
|
if(visited[scur]) continue
|
||||||
|
if(endq.includes(scur)) return true
|
||||||
|
visited[scur] = true
|
||||||
|
const neighbors = graph[scur]
|
||||||
|
startq.push(...neighbors)
|
||||||
|
}
|
||||||
|
|
||||||
|
const elen = endq.length
|
||||||
|
for(let i = 0;i<elen;i++){
|
||||||
|
const ecur = endq.shift()
|
||||||
|
if(visited[ecur]) continue
|
||||||
|
if(startq.includes(ecur)) return true
|
||||||
|
visited[ecur] = true
|
||||||
|
const neighbors = graph[ecur]
|
||||||
|
endq.push(...neighbors)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return bfs(source,destination,graph)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
|
|
||||||
|
|
@ -56,34 +56,34 @@
|
||||||
C++代码如下:
|
C++代码如下:
|
||||||
|
|
||||||
```CPP
|
```CPP
|
||||||
#include<iostream>
|
#include <iostream>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
int main() {
|
int main() {
|
||||||
string s;
|
string s;
|
||||||
while (cin >> s) {
|
while (cin >> s) {
|
||||||
|
int sOldIndex = s.size() - 1;
|
||||||
int count = 0; // 统计数字的个数
|
int count = 0; // 统计数字的个数
|
||||||
int sOldSize = s.size();
|
|
||||||
for (int i = 0; i < s.size(); i++) {
|
for (int i = 0; i < s.size(); i++) {
|
||||||
if (s[i] >= '0' && s[i] <= '9') {
|
if (s[i] >= '0' && s[i] <= '9') {
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
|
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
|
||||||
s.resize(s.size() + count * 5);
|
s.resize(s.size() + count * 5);
|
||||||
int sNewSize = s.size();
|
int sNewIndex = s.size() - 1;
|
||||||
// 从后先前将空格替换为"number"
|
// 从后往前将数字替换为"number"
|
||||||
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
|
while (sOldIndex >= 0) {
|
||||||
if (s[j] > '9' || s[j] < '0') {
|
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
|
||||||
s[i] = s[j];
|
s[sNewIndex--] = 'r';
|
||||||
|
s[sNewIndex--] = 'e';
|
||||||
|
s[sNewIndex--] = 'b';
|
||||||
|
s[sNewIndex--] = 'm';
|
||||||
|
s[sNewIndex--] = 'u';
|
||||||
|
s[sNewIndex--] = 'n';
|
||||||
} else {
|
} else {
|
||||||
s[i] = 'r';
|
s[sNewIndex--] = s[sOldIndex];
|
||||||
s[i - 1] = 'e';
|
|
||||||
s[i - 2] = 'b';
|
|
||||||
s[i - 3] = 'm';
|
|
||||||
s[i - 4] = 'u';
|
|
||||||
s[i - 5] = 'n';
|
|
||||||
i -= 5;
|
|
||||||
}
|
}
|
||||||
|
sOldIndex--;
|
||||||
}
|
}
|
||||||
cout << s << endl;
|
cout << s << endl;
|
||||||
}
|
}
|
||||||
|
|
@ -245,7 +245,60 @@ class Solution:
|
||||||
return ''.join(lst)
|
return ''.join(lst)
|
||||||
```
|
```
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
```js
|
||||||
|
const readline = require("readline");
|
||||||
|
|
||||||
|
const rl = readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
})
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
const num0 = "0".charCodeAt();
|
||||||
|
const num9 = "9".charCodeAt();
|
||||||
|
const a = "a".charCodeAt();
|
||||||
|
const z = "z".charCodeAt();
|
||||||
|
function isAZ(str) {
|
||||||
|
return str >= a && str <= z;
|
||||||
|
}
|
||||||
|
function isNumber(str) {
|
||||||
|
return str >= num0 && str <= num9;
|
||||||
|
}
|
||||||
|
rl.on("line", (input) => {
|
||||||
|
let n = 0;
|
||||||
|
for (let i = 0; i < input.length; i++) {
|
||||||
|
const val = input[i].charCodeAt();
|
||||||
|
if (isNumber(val)) {
|
||||||
|
n+= 6;
|
||||||
|
}
|
||||||
|
if (isAZ(val)) {
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const ans = new Array(n).fill(0);
|
||||||
|
let index = input.length - 1;
|
||||||
|
for (let i = n - 1; i >= 0; i--) {
|
||||||
|
const val = input[index].charCodeAt();
|
||||||
|
if (isAZ(val)) {
|
||||||
|
ans[i] = input[index];
|
||||||
|
}
|
||||||
|
if (isNumber(val)) {
|
||||||
|
ans[i] = "r";
|
||||||
|
ans[i - 1] = "e";
|
||||||
|
ans[i - 2] = "b";
|
||||||
|
ans[i - 3] = "m";
|
||||||
|
ans[i - 4] = "u";
|
||||||
|
ans[i - 5] = "n";
|
||||||
|
i -= 5;
|
||||||
|
}
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
console.log(ans.join(""));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
|
```
|
||||||
|
|
||||||
### TypeScript:
|
### TypeScript:
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue