Skip to content

Commit 1bb9af4

Browse files
committed
20181225
1 parent dad7d56 commit 1bb9af4

File tree

4 files changed

+200
-6
lines changed

4 files changed

+200
-6
lines changed

code/lc23.java

+47-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package code;
22

33
import java.util.Comparator;
4+
import java.util.List;
45
import java.util.PriorityQueue;
56

67
/*
7-
* 22. Generate Parentheses
8-
* 题意:正确括号组合的
9-
* 难度:Medium
10-
* 分类:String, Backtracking
11-
* 思路:回溯法的典型题目,按选优条件向前搜索,达到目标后就退回一步或返回
12-
* 注意:递归法别忘了两块的拼接,例如n=4时,可以由2,2拼起来作为答案
8+
* 23. Merge k Sorted Lists
9+
* 题意:K个有序链表合并
10+
* 难度:Hard
11+
* 分类:Linked List, Divide and Conquer, Heap
12+
* 思路:优先队列或分治方法
13+
* 注意:优先队列如何定义比较方法
1314
*/
1415
public class lc23 {
1516
public class ListNode {
@@ -45,4 +46,44 @@ else if (o1.val==o2.val)
4546
}
4647
return head.next;
4748
}
49+
50+
public ListNode mergeKLists2(ListNode[] lists) {
51+
if (lists==null||lists.length==0) return null;
52+
return Partition(lists,0,lists.length-1);
53+
}
54+
55+
public ListNode Partition(ListNode[] lists, int start, int end){
56+
if(end-start==0)
57+
return lists[end];
58+
else{
59+
int mid = (start+end)/2;
60+
ListNode l1 = Partition(lists,start,mid);
61+
ListNode l2 = Partition(lists,mid+1,end);
62+
return Merge2List(l1,l2);
63+
}
64+
}
65+
66+
public ListNode Merge2List(ListNode ln1, ListNode ln2){
67+
ListNode res = new ListNode(0);
68+
ListNode head = res;
69+
while(ln1!=null && ln2!=null){
70+
if(ln1.val<ln2.val){
71+
head.next = ln1;
72+
head = head.next;
73+
ln1 = ln1.next;
74+
}else {
75+
head.next = ln2;
76+
head = head.next;
77+
ln2 = ln2.next;
78+
}
79+
}
80+
if(ln1!=null){
81+
head.next = ln1;
82+
}
83+
if(ln2!=null){
84+
head.next = ln2;
85+
}
86+
return res.next;
87+
}
88+
4889
}

code/lc31.java

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package code;
2+
/*
3+
* 31. Next Permutation
4+
* 题意:找出排列组合的下一个排列
5+
* 难度:Medium
6+
* 分类:Array
7+
* 思路:从后往前找第一个变小的数x,从这个数之后的数中找出第一个比x大的数,交换,再把之后的数逆序即可
8+
* Tips:很典型的排列组合题,思路方法记忆一下。注意比较时是否有=。
9+
*/
10+
public class lc31 {
11+
public static void main(String[] args) {
12+
int[] nums = {2,3,1,3,3};
13+
nextPermutation(nums);
14+
for (int i:nums){
15+
System.out.println(i);
16+
}
17+
}
18+
19+
public static void nextPermutation(int[] nums) {
20+
int ptr = nums.length-1;
21+
22+
//从后往前找第一个变小的数x
23+
while(ptr>0&&nums[ptr-1]>=nums[ptr]){// 注意是 >= {5,1,1} , 等于--
24+
ptr--;
25+
}
26+
27+
if(ptr!=0){
28+
//从这个数之后的数中找出第一个比x大的数
29+
int n = nums[ptr];
30+
int ptr2 = ptr;
31+
for(int i=ptr+1; i<nums.length; i++){
32+
if( nums[i]>nums[ptr-1] && nums[i]<=n ) {//注意 <= {2,3,1,3,3}
33+
n = nums[i];
34+
ptr2 = i;
35+
}
36+
}
37+
nums[ptr2] = nums[ptr-1];
38+
nums[ptr-1] = n;
39+
}
40+
41+
//把之后的数逆序
42+
ReverseNums(nums,ptr,nums.length-1);
43+
}
44+
public static void ReverseNums(int[] nums, int start, int end){
45+
int l = end+start;
46+
for (int i = start; i < (start+end+1)/2 ; i++) {
47+
int temp = nums[i];
48+
nums[i] = nums[l-i];
49+
nums[l-i] = temp;
50+
}
51+
}
52+
}

code/lc32.java

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package code;
2+
3+
import java.util.Stack;
4+
5+
/*
6+
* 31. Longest Valid Parentheses
7+
* 题意:最长有效子串
8+
* 难度:Hard
9+
* 分类:Dynamic Programming, String
10+
* 思路:两种常规方法,一是dp,每个位置记录以该位置结尾的最长长度。另一种是用栈,把位置索引入栈。
11+
* Tips:想到了用dp,也想到了用数组记录位置结尾的解,但没有想好如何进行更新迭代计算。把位置索引入栈的方法很典型,关注一下。
12+
*/
13+
public class lc32 {
14+
public static void main(String[] args) {
15+
System.out.println(longestValidParentheses2("()(())"));
16+
}
17+
18+
public static int longestValidParentheses(String s) {
19+
if(s.length()==0)
20+
return 0;
21+
// dp 方法
22+
int[] dp = new int[s.length()+1];
23+
int res=0;
24+
for (int i = 2; i <dp.length; i++) {
25+
if(s.charAt(i-1)=='(')
26+
dp[i] = 0;
27+
else{
28+
if(s.charAt(i-2)=='('){ // 这种情况:(())()
29+
dp[i] = dp[i-2]+2;
30+
}else if(i-2-dp[i-1]>=0 && s.charAt(i-2-dp[i-1])=='('){ // 这种情况:()(())
31+
dp[i] = dp[i-1] + dp[i-2-dp[i-1]]+2;
32+
}
33+
}
34+
if(dp[i]>res)
35+
res = dp[i];
36+
}
37+
return res;
38+
}
39+
40+
public static int longestValidParentheses2(String s) {
41+
//栈方法 ()(())
42+
Stack<Integer> st = new Stack();
43+
st.add(-1);
44+
int res = 0;
45+
for (int i = 0; i < s.length() ; i++) {
46+
char ch = s.charAt(i);
47+
if(ch=='(')
48+
st.add(i);
49+
else if(ch==')'){
50+
st.pop();
51+
if(st.isEmpty())
52+
st.push(i);
53+
res = Math.max(res,i-st.peek());
54+
}
55+
}
56+
return res;
57+
}
58+
}

code/lc33.java

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package code;
2+
3+
/*
4+
* 31. Search in Rotated Sorted Array
5+
* 题意:Longest Valid Parentheses
6+
* 难度:Hard
7+
* 分类:Array, Binary Search
8+
* 思路:二分查找的思路,多了一步判断,判断哪部分有序,是否在这部分中
9+
* Tips:注意边界判断,是否有等号
10+
*/
11+
public class lc33 {
12+
public static void main(String[] args) {
13+
int[] nums = {1,3};
14+
System.out.println(search(nums, 3));
15+
}
16+
17+
public static int search(int[] nums, int target) {
18+
int start = 0;
19+
int end = nums.length-1;
20+
while(start<=end){
21+
if(start==end){
22+
if(nums[start]==target)
23+
return start;
24+
return -1;
25+
}
26+
int mid = (start+end)/2;
27+
if(target == nums[mid])
28+
return mid;
29+
if(nums[mid]>nums[end]){//左边是有序的
30+
if(nums[start]<=target && target<=nums[mid])
31+
end = mid-1;
32+
else
33+
start = mid+1;
34+
}else{//右边是有序的
35+
if(nums[mid]<=target && target<=nums[end])
36+
start = mid+1;
37+
else
38+
end =mid-1;
39+
}
40+
}
41+
return -1;
42+
}
43+
}

0 commit comments

Comments
 (0)