Skip to content

Commit 74d82be

Browse files
代码风水师代码风水师
authored andcommitted
添加了LeetCode算法
1 parent 4aa25ba commit 74d82be

3 files changed

Lines changed: 183 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">Leetcode:买卖股票的最佳时机 II</h3>
2+
3+
给定一个数组,它的第 *i* 个元素是一支给定股票第 *i* 天的价格。
4+
5+
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
6+
7+
**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
8+
9+
**示例 1:**
10+
11+
```java
12+
输入: [7,1,5,3,6,4]
13+
输出: 7
14+
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4
15+
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3
16+
```
17+
18+
**示例 2:**
19+
20+
```java
21+
输入: [1,2,3,4,5]
22+
输出: 4
23+
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4
24+
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
25+
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
26+
```
27+
28+
**示例 3:**
29+
30+
```java
31+
输入: [7,6,4,3,1]
32+
输出: 0
33+
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0
34+
```
35+
36+
37+
38+
**解题思路:**
39+
40+
只看涨,不看跌。不能同参与多个交易,只能根据时间分段买。
41+
42+
![过程说明图](https://i.loli.net/2019/01/24/5c49cf8b2385e.png)
43+
44+
45+
46+
**Java代码如下:**
47+
48+
```java
49+
class Solution {
50+
public int maxProfit(int[] prices) {
51+
int profit = 0;
52+
for (int i = 0; i < prices.length - 1; i++) {
53+
// 涨钱,就获利润
54+
if (prices[i + 1] > prices[i]) {
55+
profit += prices[i + 1] - prices[i];
56+
}
57+
}
58+
59+
return profit;
60+
}
61+
}
62+
```
63+
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">Leetcode:从排序数组中删除重复项</h3>
2+
3+
给定一个排序数组,你需要在**原地**删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
4+
5+
不要使用额外的数组空间,你必须在**原地修改输入数组**并在使用 O(1) 额外空间的条件下完成。
6+
7+
**示例 1:**
8+
9+
```
10+
给定数组 nums = [1,1,2],
11+
12+
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
13+
14+
你不需要考虑数组中超出新长度后面的元素。
15+
```
16+
17+
**示例 2:**
18+
19+
```
20+
给定 nums = [0,0,1,1,1,2,2,3,3,4],
21+
22+
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
23+
24+
你不需要考虑数组中超出新长度后面的元素。
25+
```
26+
27+
**说明:**
28+
29+
为什么返回数值是整数,但输出的答案是数组呢?
30+
31+
请注意,输入数组是以**“引用”**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
32+
33+
你可以想象内部操作如下:
34+
35+
```java
36+
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
37+
int len = removeDuplicates(nums);
38+
39+
// 在函数里修改输入数组对于调用者是可见的。
40+
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
41+
for (int i = 0; i < len; i++) {
42+
print(nums[i]);
43+
}
44+
```
45+
46+
47+
48+
**解题思路:**
49+
50+
题目要求必须在原数组修改,那么元素只能在原数组移动,时间复杂度 O(1),那么只能遍历一次数组。为了保证数据靠近头部,从头部开始遍历。用 index 表示当前元素前的元素都没有重复的元素,以此向后遍历,保证出现 **** 的元素(也就是前面未出现的元素)那么把它 `nums[i]` 放到 `nums[++index]` 位置。
51+
52+
总体思路:把后面第一次出现的新元素,往前放。
53+
54+
![过程说明图](https://i.loli.net/2019/01/24/5c49c5307b3be.png)
55+
56+
57+
58+
**Java代码如下:**
59+
60+
```java
61+
class Solution {
62+
public int removeDuplicates(int[] nums) {
63+
int index = 0;
64+
for (int i = 0; i < nums.length; i++) {
65+
if (nums[i] != nums[index]) {
66+
nums[++index] = nums[i];
67+
}
68+
}
69+
70+
return index + 1;
71+
}
72+
}
73+
```
74+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">Leetcode:旋转数组</h3>
2+
3+
给定一个数组,将数组中的元素向右移动 *k* 个位置,其中 *k* 是非负数。
4+
5+
**示例 1:**
6+
7+
```java
8+
输入: [1,2,3,4,5,6,7] 和 k = 3
9+
输出: [5,6,7,1,2,3,4]
10+
解释:
11+
向右旋转 1: [7,1,2,3,4,5,6]
12+
向右旋转 2: [6,7,1,2,3,4,5]
13+
向右旋转 3: [5,6,7,1,2,3,4]
14+
```
15+
16+
**示例 2:**
17+
18+
```java
19+
输入: [-1,-100,3,99] 和 k = 2
20+
输出: [3,99,-1,-100]
21+
解释:
22+
向右旋转 1: [99,-1,-100,3]
23+
向右旋转 2: [3,99,-1,-100]
24+
```
25+
26+
**说明:**
27+
28+
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
29+
- 要求使用空间复杂度为 O(1) 的原地算法。
30+
31+
32+
33+
**解题思路:**
34+
35+
36+
37+
![过程说明图]()
38+
39+
40+
41+
**Java代码如下:**
42+
43+
```java
44+
45+
```
46+

0 commit comments

Comments
 (0)