Skip to content

Commit 9028186

Browse files
committed
20181029
1 parent 02106a7 commit 9028186

File tree

6 files changed

+226
-76
lines changed

6 files changed

+226
-76
lines changed

src/main/java/leetcode/array/_153_FindMinimumInRotatedSortedArry.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/main/java/leetcode/dpandgreedy/GasStation.java

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package leetcode.dpandgreedy;
2+
/**
3+
* 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
4+
5+
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
6+
7+
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
8+
9+
说明:
10+
11+
如果题目有解,该答案即为唯一答案。
12+
输入数组均为非空数组,且长度相同。
13+
输入数组中的元素均为非负数。
14+
示例 1:
15+
16+
输入:
17+
gas = [1,2,3,4,5]
18+
cost = [3,4,5,1,2]
19+
20+
输出: 3
21+
22+
解释:
23+
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
24+
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
25+
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
26+
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
27+
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
28+
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
29+
因此,3 可为起始索引。
30+
示例 2:
31+
32+
输入:
33+
gas = [2,3,4]
34+
cost = [3,4,3]
35+
36+
输出: -1
37+
38+
解释:
39+
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
40+
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
41+
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
42+
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
43+
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
44+
因此,无论怎样,你都不可能绕环路行驶一周。
45+
46+
http://blog.csdn.net/kenden23/article/details/14106137
47+
*/
48+
public class _134_GasStation {
49+
50+
public int canCompleteCircuit(int[] gas,int[] cost){
51+
int total=0;
52+
int curSum=0;
53+
int start=0;
54+
for(int i=0;i<gas.length;i++){
55+
total+=gas[i]-cost[i];
56+
curSum+=gas[i]-cost[i];
57+
if(curSum<0){
58+
start=(i+1)%(gas.length);
59+
curSum=0;
60+
}
61+
}
62+
return total>=0?start:-1;
63+
}
64+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package leetcode.search;
2+
3+
/**
4+
* Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
5+
*
6+
* (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
7+
*
8+
* Find the minimum element.
9+
*
10+
* You may assume no _51_duplicate exists in the array.
11+
*
12+
* Example 1:
13+
*
14+
* Input: [3,4,5,1,2]
15+
* Output: 1
16+
* Example 2:
17+
*
18+
* Input: [4,5,6,7,0,1,2]
19+
* Output: 0
20+
*
21+
*
22+
*/
23+
24+
25+
public class _153_FindMinimumInRotatedSortedArry {
26+
27+
28+
public int findMin(int[] nums) {
29+
if(nums==null||nums.length==0) return -1;
30+
int mid=0;
31+
int left=0,right=nums.length-1;
32+
//控制nums[left]>=nums[right].使第一个指针永远指向第一个递增子区间,第二个指针永远指向第二个递增子区间
33+
while(nums[left]>=nums[right]&&left<right){
34+
//第一个指针已经到达第一个子区间的末尾
35+
if(right-left==1){
36+
mid=right;
37+
break;
38+
}
39+
mid=(left+right)>>1;
40+
if(nums[mid]>nums[left]){
41+
left=mid;
42+
}else{
43+
right=mid;
44+
}
45+
}
46+
47+
return nums[mid];
48+
}
49+
50+
public int findMin1(int[] nums) {
51+
int start = 0;
52+
int end = nums.length - 1;
53+
int mid = 0;
54+
while (start < end) { //注意这里和普通的二分查找不同,这里是start < end不是 start <= end.
55+
mid = start + (end - start)/2;
56+
if (nums[mid] > nums[end])
57+
start = mid + 1; //此时可以扔掉mid的值
58+
else
59+
end = mid;//此时不能扔掉mid的值
60+
}
61+
return nums[end]; //退出循环说明start与end相等,所以只剩一个元素可能,所以return [start]或者return [end]都可以了。
62+
//注意不能return mid,可以从{2,1}这个输入看出来。
63+
64+
}
65+
66+
//二分查找
67+
//https://www.cnblogs.com/luoxn28/p/5767571.html
68+
public int binarySerach(int[] array, int key) {
69+
int left = 0;
70+
int right = array.length - 1;
71+
72+
// 这里必须是 <=
73+
while (left <= right) {
74+
int mid = (left + right) / 2;
75+
if (array[mid] == key) {
76+
return mid;
77+
}
78+
else if (array[mid] < key) {
79+
left = mid + 1;
80+
}
81+
else {
82+
right = mid - 1;
83+
}
84+
}
85+
86+
return -1;
87+
}
88+
}

src/main/java/leetcode/array/_154_FindMinmumInRotateSortedArray2.java renamed to src/main/java/leetcode/search/_154_FindMinmumInRotateSortedArray2.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package leetcode.array;
1+
package leetcode.search;
22

33
/**
44
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
@@ -48,4 +48,21 @@ public int findMin(int[] nums) {
4848
return min;
4949
}
5050

51+
public int findMin1(int[] nums){
52+
int n=nums.length;
53+
int l=0,r=n-1,mid;
54+
while(l<r){
55+
mid=l+(r-l)/2;
56+
if(nums[mid]>nums[r]){
57+
l=mid+1;
58+
}else if(nums[mid]<nums[r]){
59+
r=mid;
60+
}else{
61+
r--;
62+
}
63+
}
64+
//l==r的时候跳出循环,此时这个值为最小值
65+
return nums[l];
66+
}
67+
5168
}

src/main/java/leetcode/tree/_103_BinaryTreeZigZagLevelOrderTraversal.java

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
package leetcode.tree;
22

3-
import java.util.ArrayList;
4-
import java.util.LinkedList;
5-
import java.util.Queue;
3+
import java.util.*;
64

5+
/**
6+
* 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,
7+
* 层与层之间交替进行)。
8+
9+
例如:
10+
给定二叉树 [3,9,20,null,null,15,7],
11+
12+
3
13+
/ \
14+
9 20
15+
/ \
16+
15 7
17+
返回锯齿形层次遍历如下:
18+
19+
[
20+
[3],
21+
[20,9],
22+
[15,7]
23+
]
24+
25+
*/
726

827
public class _103_BinaryTreeZigZagLevelOrderTraversal {
928
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
@@ -37,4 +56,38 @@ public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
3756
return result;
3857

3958
}
59+
60+
public List<List<Integer>> zigzagLevelOrder1(TreeNode root) {
61+
List<List<Integer>> res=new ArrayList<>();
62+
if(root==null) return res;
63+
List<Integer> result;
64+
Stack<TreeNode> s1=new Stack<>(),s2=new Stack<>();
65+
s1.push(root);
66+
while(!s1.isEmpty()||!s2.isEmpty()){
67+
if(!s1.isEmpty()){
68+
ArrayList<Integer> list=new ArrayList<Integer>();
69+
while(!s1.isEmpty()){
70+
TreeNode p=s1.pop();
71+
list.add(p.val);
72+
if(p.left!=null)
73+
s2.add(p.left);
74+
if(p.right!=null)
75+
s2.add(p.right);
76+
}
77+
res.add(list);
78+
}else {
79+
ArrayList<Integer> list=new ArrayList<Integer>();
80+
while(!s2.isEmpty()){
81+
TreeNode p=s2.pop();
82+
if(p.right!=null)
83+
s1.add(p.right);
84+
if(p.left!=null)
85+
s1.add(p.left);
86+
list.add(p.val);
87+
}
88+
res.add(list);
89+
}
90+
}
91+
return res;
92+
}
4093
}

0 commit comments

Comments
 (0)