贪心
5 天前 | #763 划分字母区间 | 中等 | 1 次 |
---|---|---|---|
5 天前 | #45 跳跃游戏 II | 中等 | 1 次 |
5 天前 | #55 跳跃游戏 | 中等 | 4 次 |
5 天前 | #121 买卖股票的最佳时机 | 简单 | 5 次 |
Beizhu:
1、跳跃游戏 注意边界条件, for循环 是根据 定义的step来的 i是从1开始的
2、跳跃游戏 2 注意边界条件 for(int i = 0;i<=end && end < nums.length-1; i++
3、划分字母区间 注意 定义 start end
# 买卖股票
class Solution {
public int maxProfit(int[] prices) {
int res = 0;
int low = Integer.MAX_VALUE;
for(int i = 0; i < prices.length; i++){
low = Math.min(prices[i], low);
res = Math.max(res, prices[i] - low);
}
return res;
}
}
思路:
1、经典贪心算法,每次循环需记录最低的价格
2、然后找到最大的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 跳跃游戏
class Solution {
public boolean canJump(int[] nums) {
if(nums.length <=1){
return true;
}
int step = nums[0];
for(int i = 1; i<=step; i++ ){
step = Math.max(step, nums[i]+i);
if(step >= nums.length-1){
return true;
}
}
return false;
}
}
思路:
1、注意结束条件 如果 个数小于等于1个 直接一步就跳完喽
2、记录步数 第一次就是nums[0], 从一开始循环 , 记录最大步数
3、做一个剪枝操作 就是 当 最大步数大于等于 数组的长度时 直接 返回true;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 跳跃游戏2
class Solution {
public int jump(int[] nums) {
int result = 0;
int end = 0;
int temp = 0;
for(int i= 0; i<=end && end< nums.length-1; i++){
temp = Math.max(temp, nums[i]+i);
if(i == end){
end = temp;
result++;
}
}
return result;
}
}
思路:
1、相比1的能否到达 ,这里是需要的最小步数
2、所以需要一个end来记录下跳跃的位置
3、for循环条件 增加end 以及 I的判断,步数的选取依然跟 1一样
4、如果 i==end的话 也说明可以跳跃 就让end为步数 并且 result++ 记录跳跃数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 划分字母区间
class Solution {
public List<Integer> partitionLabels(String s) {
int[] last = new int[26];
for(int i = 0; i< s.length(); i++){
last[s.charAt(i)- 'a'] = i;
}
List<Integer> res = new ArrayList<>();
int start = 0;
int end = 0;
for(int i = 0; i< s.length(); i++){
end = Math.max(end, last[s.charAt(i) - 'a']);
if(i == end){
res.add(end-start+1);
start = end+1;
}
}
return res;
}
}
思路:
1、记录一个last的字典数组 用于下面的取值
2、循环中 end进行贪心 ,取最大值的判断 利用last的字典数组进行判断
3、后续循环类似于 跳跃2 如果i==end的话 证明可以进行划分,就把 end-start+1放到res中,之后start为end+1用于下次循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上次更新: 2024/03/26, 9:03:00