Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions problems/0056.合并区间.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,24 +207,26 @@ class Solution:
```

### Go
```golang
```go
func merge(intervals [][]int) [][]int {
//先从小到大排序
sort.Slice(intervals,func(i,j int)bool{
return intervals[i][0]<intervals[j][0]
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
//再弄重复的
for i:=0;i<len(intervals)-1;i++{
if intervals[i][1]>=intervals[i+1][0]{
intervals[i][1]=max(intervals[i][1],intervals[i+1][1])//赋值最大值
intervals=append(intervals[:i+1],intervals[i+2:]...)
i--
res := make([][]int, 0, len(intervals))
left, right := intervals[0][0], intervals[0][1]
for i := 1; i < len(intervals); i++ {
if right < intervals[i][0] {
res = append(res, []int{left, right})
left, right = intervals[i][0], intervals[i][1]
} else {
right = max(right, intervals[i][1])
}
}
return intervals
res = append(res, []int{left, right}) // 将最后一个区间放入
return res
}
func max(a,b int)int{
if a>b{
func max(a, b int) int {
if a > b {
return a
}
return b
Expand Down
66 changes: 30 additions & 36 deletions problems/0435.无重叠区间.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@

每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。

接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘已经是按照右边界排序的了**。
接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。

区间4结束之后,在找到区间6,所以一共记录非交叉区间的个数是三个。
区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。

总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。

Expand Down Expand Up @@ -183,23 +183,19 @@ public:
```java
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> {
// 按照区间右边界升序排序
return a[1] - b[1];
Arrays.sort(intervals, (a,b)-> {
return Integer.compare(a[0],b[0]);
});

int count = 0;
int edge = Integer.MIN_VALUE;
for (int i = 0; i < intervals.length; i++) {
// 若上一个区间的右边界小于当前区间的左边界,说明无交集
if (edge <= intervals[i][0]) {
edge = intervals[i][1];
} else {
int count = 1;
for(int i = 1;i < intervals.length;i++){
if(intervals[i][0] < intervals[i-1][1]){
intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
continue;
}else{
count++;
}
}
}

return count;
return intervals.length - count;
}
}
```
Expand All @@ -208,16 +204,15 @@ class Solution {
```java
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {

Arrays.sort(intervals,(a,b)->{
Arrays.sort(intervals, (a,b)-> {
return Integer.compare(a[0],b[0]);
});
int remove = 0;
int pre = intervals[0][1];
for(int i=1;i<intervals.length;i++){
if(pre>intervals[i][0]) {
for(int i = 1; i < intervals.length; i++) {
if(pre > intervals[i][0]) {
remove++;
pre = Math.min(pre,intervals[i][1]);
pre = Math.min(pre, intervals[i][1]);
}
else pre = intervals[i][1];
}
Expand All @@ -242,27 +237,26 @@ class Solution:
```

### Go
```golang
```go
func eraseOverlapIntervals(intervals [][]int) int {
var flag int
//先排序
sort.Slice(intervals,func(i,j int)bool{
return intervals[i][0]<intervals[j][0]
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
fmt.Println(intervals)
for i:=1;i<len(intervals);i++{
if intervals[i-1][1]>intervals[i][0]{
flag++
intervals[i][1]=min(intervals[i-1][1],intervals[i][1])//由于是先排序的,所以,第一位是递增顺序,故只需要将临近两个元素的第二个值最小值更新到该元素的第二个值即可作之后的判断
res := 1
for i := 1; i < len(intervals); i++ {
if intervals[i][0] >= intervals[i-1][1] {
res++
} else {
intervals[i][1] = min(intervals[i - 1][1], intervals[i][1])
}
}
return flag
return len(intervals) - res
}
func min(a,b int)int{
if a>b{
return b
func min(a, b int) int {
if a < b {
return a
}
return a
return b
}
```

Expand Down
87 changes: 87 additions & 0 deletions problems/0501.二叉搜索树中的众数.md
Original file line number Diff line number Diff line change
Expand Up @@ -837,6 +837,93 @@ object Solution {
}
```

## rust

递归:

```rust
impl Solution {
pub fn find_mode(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let mut count = 0;
let mut max_count = 0;
let mut res = vec![];
let mut pre = i32::MIN;
Self::search_bst(&root, &mut pre, &mut res, &mut count, &mut max_count);
res
}
pub fn search_bst(
cur: &Option<Rc<RefCell<TreeNode>>>,
mut pre: &mut i32,
res: &mut Vec<i32>,
count: &mut i32,
max_count: &mut i32,
) {
if cur.is_none() {
return;
}

let cur_node = cur.as_ref().unwrap().borrow();
Self::search_bst(&cur_node.left, pre, res, count, max_count);
if *pre == i32::MIN {
*count = 1;
} else if *pre == cur_node.val {
*count += 1;
} else {
*count = 1;
};
match count.cmp(&max_count) {
std::cmp::Ordering::Equal => res.push(cur_node.val),
std::cmp::Ordering::Greater => {
*max_count = *count;
res.clear();
res.push(cur_node.val);
}
_ => {}
};
*pre = cur_node.val;
Self::search_bst(&cur_node.right, pre, res, count, max_count);
}
}
```

迭代:

```rust
pub fn find_mode(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let (mut cur, mut pre) = (root, i32::MIN);
let mut res = vec![];
let mut stack = vec![];
let (mut count, mut max_count) = (0, 0);
while !stack.is_empty() || cur.is_some() {
while let Some(node) = cur {
cur = node.borrow().left.clone();
stack.push(node);
}
if let Some(node) = stack.pop() {
if pre == i32::MIN {
count = 1;
} else if pre == node.borrow().val {
count += 1;
} else {
count = 1;
}
match count.cmp(&max_count) {
std::cmp::Ordering::Equal => res.push(node.borrow().val),
std::cmp::Ordering::Greater => {
max_count = count;
res.clear();
res.push(node.borrow().val);
}
_ => {}
}
pre = node.borrow().val;
cur = node.borrow().right.clone();
}
}
res
}
```


<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
Expand Down
87 changes: 87 additions & 0 deletions problems/0530.二叉搜索树的最小绝对差.md
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,93 @@ object Solution {
}
```

## rust

构建二叉树的有序数组:

```rust
use std::cell::RefCell;
use std::rc::Rc;
impl Solution {
pub fn get_minimum_difference(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let mut vec = vec![];
Self::traversal(root, &mut vec);
let mut min = i32::MAX;
for i in 1..vec.len() {
min = min.min(vec[i] - vec[i - 1])
}
min
}
pub fn traversal(root: Option<Rc<RefCell<TreeNode>>>, v: &mut Vec<i32>) {
if root.is_none() {
return;
}
let node = root.as_ref().unwrap().borrow();
Self::traversal(node.left.clone(), v);
v.push(node.val);
Self::traversal(node.right.clone(), v);
}
}
```

递归中解决

```rust
impl Solution {
pub fn get_minimum_difference(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let mut pre = None;
let mut min = i32::MAX;
Self::inorder(root, &mut pre, &mut min);
min
}
pub fn inorder(root: Option<Rc<RefCell<TreeNode>>>, pre: &mut Option<i32>, min: &mut i32) {
if root.is_none() {
return;
}
let node = root.as_ref().unwrap().borrow();
Self::inorder(node.left.clone(), pre, min);
if let Some(pre) = pre {
*min = (node.val - *pre).min(*min);
}
*pre = Some(node.val);

Self::inorder(node.right.clone(), pre, min);
}
}
```

迭代

```rust
impl Solution {
pub fn get_minimum_difference(mut root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
if root.is_none() {
return 0;
}
let mut stack = vec![];
let mut pre = -1;
let mut res = i32::MAX;
while root.is_some() || !stack.is_empty() {
while let Some(node) = root {
root = node.borrow().left.clone();
stack.push(node);
}

let node = stack.pop().unwrap();

if pre >= 0 {
res = res.min(node.borrow().val - pre);
}

pre = node.borrow().val;

root = node.borrow().right.clone();
}
res
}
}
```

<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
Expand Down
3 changes: 2 additions & 1 deletion problems/0617.合并二叉树.md
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ class Solution {
if (node1.left == null && node2.left != null) {
node1.left = node2.left;
}
// 若node2的左节点为空,直接赋值
// 若node1的右节点为空,直接赋值
if (node1.right == null && node2.right != null) {
node1.right = node2.right;
}
Expand Down Expand Up @@ -732,3 +732,4 @@ impl Solution {
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>

16 changes: 8 additions & 8 deletions problems/0714.买卖股票的最佳时机含手续费.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,25 +217,25 @@ class Solution: # 贪心思路
```

### Go
```golang
```go
func maxProfit(prices []int, fee int) int {
var minBuy int = prices[0] //第一天买入
var res int
for i:=0;i<len(prices);i++{
for i := 0; i < len(prices); i++ {
//如果当前价格小于最低价,则在此处买入
if prices[i]<minBuy{
minBuy=prices[i]
if prices[i] < minBuy {
minBuy = prices[i]
}
//如果以当前价格卖出亏本,则不卖,继续找下一个可卖点
if prices[i]>=minBuy&&prices[i]-fee-minBuy<=0{
if prices[i] >= minBuy && prices[i]-fee-minBuy <= 0 {
continue
}
//可以售卖了
if prices[i]>minBuy+fee{
if prices[i] > minBuy+fee {
//累加每天的收益
res+=prices[i]-minBuy-fee
res += prices[i]-minBuy-fee
//更新最小值(如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,所以要让minBuy = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!)
minBuy=prices[i]-fee
minBuy = prices[i]-fee
}
}
return res
Expand Down
Loading