mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Merge branch 'master' into master
This commit is contained in:
@ -224,6 +224,31 @@ func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer[] $nums
|
||||
* @param Integer $target
|
||||
* @return Integer[]
|
||||
*/
|
||||
function twoSum($nums, $target) {
|
||||
if (count($nums) == 0) {
|
||||
return [];
|
||||
}
|
||||
$table = [];
|
||||
for ($i = 0; $i < count($nums); $i++) {
|
||||
$temp = $target - $nums[$i];
|
||||
if (isset($table[$temp])) {
|
||||
return [$table[$temp], $i];
|
||||
}
|
||||
$table[$nums[$i]] = $i;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||||
|
@ -393,6 +393,46 @@ function threeSum(array $nums): array
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer[] $nums
|
||||
* @return Integer[][]
|
||||
*/
|
||||
function threeSum($nums) {
|
||||
$res = [];
|
||||
sort($nums);
|
||||
for ($i = 0; $i < count($nums); $i++) {
|
||||
if ($nums[$i] > 0) {
|
||||
return $res;
|
||||
}
|
||||
if ($i > 0 && $nums[$i] == $nums[$i - 1]) {
|
||||
continue;
|
||||
}
|
||||
$left = $i + 1;
|
||||
$right = count($nums) - 1;
|
||||
while ($left < $right) {
|
||||
$sum = $nums[$i] + $nums[$left] + $nums[$right];
|
||||
if ($sum < 0) {
|
||||
$left++;
|
||||
}
|
||||
else if ($sum > 0) {
|
||||
$right--;
|
||||
}
|
||||
else {
|
||||
$res[] = [$nums[$i], $nums[$left], $nums[$right]];
|
||||
while ($left < $right && $nums[$left] == $nums[$left + 1]) $left++;
|
||||
while ($left < $right && $nums[$right] == $nums[$right - 1]) $right--;
|
||||
$left++;
|
||||
$right--;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----------------------
|
||||
|
@ -310,6 +310,49 @@ var fourSum = function(nums, target) {
|
||||
};
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer[] $nums
|
||||
* @param Integer $target
|
||||
* @return Integer[][]
|
||||
*/
|
||||
function fourSum($nums, $target) {
|
||||
$res = [];
|
||||
sort($nums);
|
||||
for ($i = 0; $i < count($nums); $i++) {
|
||||
if ($i > 0 && $nums[$i] == $nums[$i - 1]) {
|
||||
continue;
|
||||
}
|
||||
for ($j = $i + 1; $j < count($nums); $j++) {
|
||||
if ($j > $i + 1 && $nums[$j] == $nums[$j - 1]) {
|
||||
continue;
|
||||
}
|
||||
$left = $j + 1;
|
||||
$right = count($nums) - 1;
|
||||
while ($left < $right) {
|
||||
$sum = $nums[$i] + $nums[$j] + $nums[$left] + $nums[$right];
|
||||
if ($sum < $target) {
|
||||
$left++;
|
||||
}
|
||||
else if ($sum > $target) {
|
||||
$right--;
|
||||
}
|
||||
else {
|
||||
$res[] = [$nums[$i], $nums[$j], $nums[$left], $nums[$right]];
|
||||
while ($left < $right && $nums[$left] == $nums[$left+1]) $left++;
|
||||
while ($left < $right && $nums[$right] == $nums[$right-1]) $right--;
|
||||
$left++;
|
||||
$right--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
@ -242,8 +242,59 @@ var combine = function(n, k) {
|
||||
};
|
||||
```
|
||||
|
||||
C:
|
||||
```c
|
||||
int* path;
|
||||
int pathTop;
|
||||
int** ans;
|
||||
int ansTop;
|
||||
|
||||
void backtracking(int n, int k,int startIndex) {
|
||||
//当path中元素个数为k个时,我们需要将path数组放入ans二维数组中
|
||||
if(pathTop == k) {
|
||||
//path数组为我们动态申请,若直接将其地址放入二维数组,path数组中的值会随着我们回溯而逐渐变化
|
||||
//因此创建新的数组存储path中的值
|
||||
int* temp = (int*)malloc(sizeof(int) * k);
|
||||
int i;
|
||||
for(i = 0; i < k; i++) {
|
||||
temp[i] = path[i];
|
||||
}
|
||||
ans[ansTop++] = temp;
|
||||
return ;
|
||||
}
|
||||
|
||||
int j;
|
||||
for(j = startIndex; j <= n- (k - pathTop) + 1;j++) {
|
||||
//将当前结点放入path数组
|
||||
path[pathTop++] = j;
|
||||
//进行递归
|
||||
backtracking(n, k, j + 1);
|
||||
//进行回溯,将数组最上层结点弹出
|
||||
pathTop--;
|
||||
}
|
||||
}
|
||||
|
||||
int** combine(int n, int k, int* returnSize, int** returnColumnSizes){
|
||||
//path数组存储符合条件的结果
|
||||
path = (int*)malloc(sizeof(int) * k);
|
||||
//ans二维数组存储符合条件的结果数组的集合。(数组足够大,避免极端情况)
|
||||
ans = (int**)malloc(sizeof(int*) * 10000);
|
||||
pathTop = ansTop = 0;
|
||||
|
||||
//回溯算法
|
||||
backtracking(n, k, 1);
|
||||
//最后的返回大小为ans数组大小
|
||||
*returnSize = ansTop;
|
||||
//returnColumnSizes数组存储ans二维数组对应下标中一维数组的长度(都为k)
|
||||
*returnColumnSizes = (int*)malloc(sizeof(int) *(*returnSize));
|
||||
int i;
|
||||
for(i = 0; i < *returnSize; i++) {
|
||||
(*returnColumnSizes)[i] = k;
|
||||
}
|
||||
//返回ans二维数组
|
||||
return ans;
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
@ -87,27 +87,33 @@ public:
|
||||
|
||||
python代码:
|
||||
|
||||
```python
|
||||
# 迭代法
|
||||
|
||||
```python3
|
||||
|
||||
class Solution:
|
||||
"""二叉树层序遍历迭代解法"""
|
||||
|
||||
def levelOrder(self, root: TreeNode) -> List[List[int]]:
|
||||
results = []
|
||||
if not root:
|
||||
return []
|
||||
return results
|
||||
|
||||
from collections import deque
|
||||
que = deque([root])
|
||||
|
||||
while que:
|
||||
size = len(que)
|
||||
result = []
|
||||
for _ in range(size):
|
||||
cur = que.popleft()
|
||||
result.append(cur.val)
|
||||
if cur.left:
|
||||
que.append(cur.left)
|
||||
if cur.right:
|
||||
que.append(cur.right)
|
||||
results.append(result)
|
||||
|
||||
queue = [root]
|
||||
out_list = []
|
||||
|
||||
while queue:
|
||||
length = len(queue)
|
||||
in_list = []
|
||||
for _ in range(length):
|
||||
curnode = queue.pop(0) # (默认移除列表最后一个元素)这里需要移除队列最头上的那个
|
||||
in_list.append(curnode.val)
|
||||
if curnode.left: queue.append(curnode.left)
|
||||
if curnode.right: queue.append(curnode.right)
|
||||
out_list.append(in_list)
|
||||
|
||||
return out_list
|
||||
return results
|
||||
```
|
||||
```python
|
||||
# 递归法
|
||||
@ -288,29 +294,29 @@ python代码:
|
||||
|
||||
```python
|
||||
class Solution:
|
||||
"""二叉树层序遍历II迭代解法"""
|
||||
|
||||
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
|
||||
results = []
|
||||
if not root:
|
||||
return []
|
||||
quene = [root]
|
||||
out_list = []
|
||||
return results
|
||||
|
||||
while quene:
|
||||
in_list = []
|
||||
for _ in range(len(quene)):
|
||||
node = quene.pop(0)
|
||||
in_list.append(node.val)
|
||||
if node.left:
|
||||
quene.append(node.left)
|
||||
if node.right:
|
||||
quene.append(node.right)
|
||||
|
||||
out_list.append(in_list)
|
||||
|
||||
out_list.reverse()
|
||||
return out_list
|
||||
|
||||
# 执行用时:36 ms, 在所有 Python3 提交中击败了92.00%的用户
|
||||
# 内存消耗:15.2 MB, 在所有 Python3 提交中击败了63.76%的用户
|
||||
from collections import deque
|
||||
que = deque([root])
|
||||
|
||||
while que:
|
||||
result = []
|
||||
for _ in range(len(que)):
|
||||
cur = que.popleft()
|
||||
result.append(cur.val)
|
||||
if cur.left:
|
||||
que.append(cur.left)
|
||||
if cur.right:
|
||||
que.append(cur.right)
|
||||
results.append(result)
|
||||
|
||||
results.reverse()
|
||||
return results
|
||||
```
|
||||
|
||||
Java:
|
||||
@ -642,32 +648,29 @@ python代码:
|
||||
|
||||
```python
|
||||
class Solution:
|
||||
"""二叉树层平均值迭代解法"""
|
||||
|
||||
def averageOfLevels(self, root: TreeNode) -> List[float]:
|
||||
results = []
|
||||
if not root:
|
||||
return []
|
||||
return results
|
||||
|
||||
quene = deque([root])
|
||||
out_list = []
|
||||
|
||||
while quene:
|
||||
in_list = []
|
||||
|
||||
for _ in range(len(quene)):
|
||||
node = quene.popleft()
|
||||
in_list.append(node.val)
|
||||
if node.left:
|
||||
quene.append(node.left)
|
||||
if node.right:
|
||||
quene.append(node.right)
|
||||
|
||||
out_list.append(in_list)
|
||||
|
||||
out_list = map(lambda x: sum(x) / len(x), out_list)
|
||||
|
||||
return out_list
|
||||
from collections import deque
|
||||
que = deque([root])
|
||||
|
||||
# 执行用时:56 ms, 在所有 Python3 提交中击败了81.48%的用户
|
||||
# 内存消耗:17 MB, 在所有 Python3 提交中击败了89.68%的用户
|
||||
while que:
|
||||
size = len(que)
|
||||
sum_ = 0
|
||||
for _ in range(size):
|
||||
cur = que.popleft()
|
||||
sum_ += cur.val
|
||||
if cur.left:
|
||||
que.append(cur.left)
|
||||
if cur.right:
|
||||
que.append(cur.right)
|
||||
results.append(sum_ / size)
|
||||
|
||||
return results
|
||||
```
|
||||
|
||||
java:
|
||||
@ -837,52 +840,28 @@ public:
|
||||
python代码:
|
||||
|
||||
```python
|
||||
|
||||
class Solution:
|
||||
"""N叉树的层序遍历迭代法"""
|
||||
|
||||
def levelOrder(self, root: 'Node') -> List[List[int]]:
|
||||
results = []
|
||||
if not root:
|
||||
return []
|
||||
return results
|
||||
|
||||
quene = deque([root])
|
||||
out_list = []
|
||||
|
||||
while quene:
|
||||
in_list = []
|
||||
|
||||
for _ in range(len(quene)):
|
||||
node = quene.popleft()
|
||||
in_list.append(node.val)
|
||||
if node.children:
|
||||
# 这个地方要用extend而不是append,我们看下面的例子:
|
||||
# In [18]: alist=[]
|
||||
# In [19]: alist.append([1,2,3])
|
||||
# In [20]: alist
|
||||
# Out[20]: [[1, 2, 3]]
|
||||
# In [21]: alist.extend([4,5,6])
|
||||
# In [22]: alist
|
||||
# Out[22]: [[1, 2, 3], 4, 5, 6]
|
||||
# 可以看到extend对要添加的list进行了一个解包操作
|
||||
# print(root.children),可以得到children是一个包含
|
||||
# 孩子节点地址的list,我们使用for遍历quene的时候,
|
||||
# 希望quene是一个单层list,所以要用extend
|
||||
# 使用extend的情况,如果print(quene),结果是
|
||||
# deque([<__main__.Node object at 0x7f60763ae0a0>])
|
||||
# deque([<__main__.Node object at 0x7f607636e6d0>, <__main__.Node object at 0x7f607636e130>, <__main__.Node object at 0x7f607636e310>])
|
||||
# deque([<__main__.Node object at 0x7f607636e880>, <__main__.Node object at 0x7f607636ef10>])
|
||||
# 可以看到是单层list
|
||||
# 如果使用append,print(quene)的结果是
|
||||
# deque([<__main__.Node object at 0x7f18907530a0>])
|
||||
# deque([[<__main__.Node object at 0x7f18907136d0>, <__main__.Node object at 0x7f1890713130>, <__main__.Node object at 0x7f1890713310>]])
|
||||
# 可以看到是两层list,这样for的遍历就会报错
|
||||
|
||||
quene.extend(node.children)
|
||||
|
||||
out_list.append(in_list)
|
||||
from collections import deque
|
||||
que = deque([root])
|
||||
|
||||
return out_list
|
||||
|
||||
# 执行用时:60 ms, 在所有 Python3 提交中击败了76.99%的用户
|
||||
# 内存消耗:16.5 MB, 在所有 Python3 提交中击败了89.19%的用户
|
||||
while que:
|
||||
result = []
|
||||
for _ in range(len(que)):
|
||||
cur = que.popleft()
|
||||
result.append(cur.val)
|
||||
# cur.children 是 Node 对象组成的列表,也可能为 None
|
||||
if cur.children:
|
||||
que.extend(cur.children)
|
||||
results.append(result)
|
||||
|
||||
return results
|
||||
```
|
||||
|
||||
java:
|
||||
|
@ -223,6 +223,37 @@ func isHappy(_ n: Int) -> Bool {
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer $n
|
||||
* @return Boolean
|
||||
*/
|
||||
function isHappy($n) {
|
||||
// use a set to record sum
|
||||
// whenever there is a duplicated, stop
|
||||
// == 1 return true, else false
|
||||
$table = [];
|
||||
while ($n != 1 && !isset($table[$n])) {
|
||||
$table[$n] = 1;
|
||||
$n = self::getNextN($n);
|
||||
}
|
||||
return $n == 1;
|
||||
}
|
||||
|
||||
function getNextN(int $n) {
|
||||
$res = 0;
|
||||
while ($n > 0) {
|
||||
$temp = $n % 10;
|
||||
$res += $temp * $temp;
|
||||
$n = floor($n / 10);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||||
|
@ -331,8 +331,32 @@ func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
PHP:
|
||||
```php
|
||||
/**
|
||||
* Definition for singly-linked list.
|
||||
* type ListNode struct {
|
||||
* Val int
|
||||
* Next *ListNode
|
||||
* }
|
||||
*/
|
||||
// 虚拟头+双指针
|
||||
func removeElements(head *ListNode, val int) *ListNode {
|
||||
dummyHead := &ListNode{}
|
||||
dummyHead.Next = head
|
||||
pred := dummyHead
|
||||
cur := head
|
||||
for cur != nil {
|
||||
if cur.Val == val {
|
||||
pred.Next = cur.Next
|
||||
} else {
|
||||
pred = cur
|
||||
}
|
||||
cur = cur.Next
|
||||
}
|
||||
return dummyHead.Next
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
@ -221,6 +221,41 @@ func isAnagram(_ s: String, _ t: String) -> Bool {
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param String $s
|
||||
* @param String $t
|
||||
* @return Boolean
|
||||
*/
|
||||
function isAnagram($s, $t) {
|
||||
if (strlen($s) != strlen($t)) {
|
||||
return false;
|
||||
}
|
||||
$table = [];
|
||||
for ($i = 0; $i < strlen($s); $i++) {
|
||||
if (!isset($table[$s[$i]])) {
|
||||
$table[$s[$i]] = 1;
|
||||
} else {
|
||||
$table[$s[$i]]++;
|
||||
}
|
||||
if (!isset($table[$t[$i]])) {
|
||||
$table[$t[$i]] = -1;
|
||||
} else {
|
||||
$table[$t[$i]]--;
|
||||
}
|
||||
}
|
||||
foreach ($table as $record) {
|
||||
if ($record != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 相关题目
|
||||
|
||||
* 383.赎金信
|
||||
|
@ -209,6 +209,35 @@ func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer[] $nums1
|
||||
* @param Integer[] $nums2
|
||||
* @return Integer[]
|
||||
*/
|
||||
function intersection($nums1, $nums2) {
|
||||
if (count($nums1) == 0 || count($nums2) == 0) {
|
||||
return [];
|
||||
}
|
||||
$counts = [];
|
||||
$res = [];
|
||||
foreach ($nums1 as $num) {
|
||||
$counts[$num] = 1;
|
||||
}
|
||||
foreach ($nums2 as $num) {
|
||||
if (isset($counts[$num])) {
|
||||
$res[] = $num;
|
||||
}
|
||||
unset($counts[$num]);
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 相关题目
|
||||
|
||||
* 350.两个数组的交集 II
|
||||
|
@ -267,6 +267,54 @@ var canConstruct = function(ransomNote, magazine) {
|
||||
```
|
||||
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param String $ransomNote
|
||||
* @param String $magazine
|
||||
* @return Boolean
|
||||
*/
|
||||
function canConstruct($ransomNote, $magazine) {
|
||||
if (count($ransomNote) > count($magazine)) {
|
||||
return false;
|
||||
}
|
||||
$map = [];
|
||||
for ($i = 0; $i < strlen($magazine); $i++) {
|
||||
$map[$magazine[$i]] = ($map[$magazine[$i]] ?? 0) + 1;
|
||||
}
|
||||
for ($i = 0; $i < strlen($ransomNote); $i++) {
|
||||
if (!isset($map[$ransomNote[$i]]) || --$map[$ransomNote[$i]] < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
Swift:
|
||||
```swift
|
||||
func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool {
|
||||
var record = Array(repeating: 0, count: 26);
|
||||
let aUnicodeScalarValue = "a".unicodeScalars.first!.value
|
||||
for unicodeScalar in magazine.unicodeScalars {
|
||||
// 通过record 记录 magazine 里各个字符出现的次数
|
||||
let idx: Int = Int(unicodeScalar.value - aUnicodeScalarValue)
|
||||
record[idx] += 1
|
||||
}
|
||||
for unicodeScalar in ransomNote.unicodeScalars {
|
||||
// 遍历 ransomNote,在record里对应的字符个数做 -- 操作
|
||||
let idx: Int = Int(unicodeScalar.value - aUnicodeScalarValue)
|
||||
record[idx] -= 1
|
||||
// 如果小于零说明在magazine没有
|
||||
if record[idx] < 0 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
@ -221,6 +221,66 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) {
|
||||
```
|
||||
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
/**
|
||||
* @param Integer[] $nums1
|
||||
* @param Integer[] $nums2
|
||||
* @param Integer[] $nums3
|
||||
* @param Integer[] $nums4
|
||||
* @return Integer
|
||||
*/
|
||||
function fourSumCount($nums1, $nums2, $nums3, $nums4) {
|
||||
$map = [];
|
||||
foreach ($nums1 as $n1) {
|
||||
foreach ($nums2 as $n2) {
|
||||
$temp = $n1 + $n2;
|
||||
$map[$temp] = isset($map[$temp]) ? $map[$temp]+1 : 1;
|
||||
}
|
||||
}
|
||||
$count = 0;
|
||||
foreach ($nums3 as $n3) {
|
||||
foreach ($nums4 as $n4) {
|
||||
$temp = 0 - $n3 - $n4;
|
||||
if (isset($map[$temp])) {
|
||||
$count += $map[$temp];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $count;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Swift:
|
||||
```swift
|
||||
func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int]) -> Int {
|
||||
// key:a+b的数值,value:a+b数值出现的次数
|
||||
var map = [Int: Int]()
|
||||
// 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中
|
||||
for i in 0 ..< nums1.count {
|
||||
for j in 0 ..< nums2.count {
|
||||
let sum1 = nums1[i] + nums2[j]
|
||||
map[sum1] = (map[sum1] ?? 0) + 1
|
||||
}
|
||||
}
|
||||
// 统计a+b+c+d = 0 出现的次数
|
||||
var res = 0
|
||||
// 在遍历大num3和num4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
|
||||
for i in 0 ..< nums3.count {
|
||||
for j in 0 ..< nums4.count {
|
||||
let sum2 = nums3[i] + nums4[j]
|
||||
let other = 0 - sum2
|
||||
if map.keys.contains(other) {
|
||||
res += map[other]!
|
||||
}
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----------------------
|
||||
|
@ -197,11 +197,10 @@ func findContentChildren(g []int, s []int) int {
|
||||
|
||||
return child
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Javascript:
|
||||
```Javascript
|
||||
|
||||
```
|
||||
var findContentChildren = function(g, s) {
|
||||
g = g.sort((a, b) => a - b)
|
||||
s = s.sort((a, b) => a - b)
|
||||
|
@ -265,7 +265,7 @@ func getMinimumDifference(root *TreeNode) int {
|
||||
```
|
||||
|
||||
## JavaScript
|
||||
|
||||
递归 先转换为有序数组
|
||||
```javascript
|
||||
/**
|
||||
* Definition for a binary tree node.
|
||||
@ -297,6 +297,47 @@ var getMinimumDifference = function (root) {
|
||||
return diff;
|
||||
};
|
||||
```
|
||||
递归 在递归的过程中更新最小值
|
||||
```js
|
||||
var getMinimumDifference = function(root) {
|
||||
let res = Infinity
|
||||
let preNode = null
|
||||
// 中序遍历
|
||||
const inorder = (node) => {
|
||||
if(!node) return
|
||||
inorder(node.left)
|
||||
// 更新res
|
||||
if(preNode) res = Math.min(res, node.val - preNode.val)
|
||||
// 记录前一个节点
|
||||
preNode = node
|
||||
inorder(node.right)
|
||||
}
|
||||
inorder(root)
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
迭代 中序遍历
|
||||
```js
|
||||
var getMinimumDifference = function(root) {
|
||||
let stack = []
|
||||
let cur = root
|
||||
let res = Infinity
|
||||
let pre = null
|
||||
while(cur || stack.length) {
|
||||
if(cur) {
|
||||
stack.push(cur)
|
||||
cur = cur.left
|
||||
} else {
|
||||
cur = stack.pop()
|
||||
if(pre) res = Math.min(res, cur.val - pre.val)
|
||||
pre = cur
|
||||
cur = cur.right
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
@ -270,6 +270,40 @@ def sorted_squares(nums)
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
C:
|
||||
```c
|
||||
int* sortedSquares(int* nums, int numsSize, int* returnSize){
|
||||
//返回的数组大小就是原数组大小
|
||||
*returnSize = numsSize;
|
||||
//创建两个指针,right指向数组最后一位元素,left指向数组第一位元素
|
||||
int right = numsSize - 1;
|
||||
int left = 0;
|
||||
|
||||
//最后要返回的结果数组
|
||||
int* ans = (int*)malloc(sizeof(int) * numsSize);
|
||||
int index;
|
||||
for(index = numsSize - 1; index >= 0; index--) {
|
||||
//左指针指向元素的平方
|
||||
int lSquare = nums[left] * nums[left];
|
||||
//右指针指向元素的平方
|
||||
int rSquare = nums[right] * nums[right];
|
||||
//若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
|
||||
if(lSquare > rSquare) {
|
||||
ans[index] = lSquare;
|
||||
left++;
|
||||
}
|
||||
//若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
|
||||
else {
|
||||
ans[index] = rSquare;
|
||||
right--;
|
||||
}
|
||||
}
|
||||
//返回结果数组
|
||||
return ans;
|
||||
}
|
||||
```
|
||||
|
||||
PHP:
|
||||
```php
|
||||
class Solution {
|
||||
@ -300,6 +334,7 @@ class Solution {
|
||||
```
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
我们先看一下前序遍历。
|
||||
|
||||
前序遍历是中左右,每次先处理的是中间节点,那么先将跟节点放入栈中,然后将右孩子加入栈,再加入左孩子。
|
||||
前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。
|
||||
|
||||
为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。
|
||||
|
||||
@ -140,7 +140,7 @@ public:
|
||||
|
||||
# 总结
|
||||
|
||||
此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不想递归写法那样代码稍做调整,就可以实现前后中序。
|
||||
此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。
|
||||
|
||||
**这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!**
|
||||
|
||||
|
Reference in New Issue
Block a user