Skip to content

Commit 65512a3

Browse files
authored
Update Longest_Increasing_Subsequence.java
1 parent d1ac8fd commit 65512a3

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

arrays/Longest_Increasing_Subsequence.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ Time complexity O(n^2) or O(nlogn)
2222
2323
2424
解:
25+
26+
方法一:
2527
dynanmic programming
2628
2729
dp[i]表示包含nums[i]在内的最长递增子序列。
@@ -65,3 +67,61 @@ public int longestIncreasingSubsequence(int[] nums) {
6567
}
6668
}
6769

70+
71+
72+
/*
73+
74+
方法二:
75+
使用一个List来保存LIS。最后返回list的长度就是LIS长度。
76+
77+
假设如果整个输入数组是增序,那么每访问到一个数,只需要把这个数加入list即可。
78+
79+
假设如果输入是乱序,每访问到一个数nums[i]时:
80+
1.如果list中没有数,直接加入list。
81+
2.如果list中有数:
82+
1)nums[i]大于list中的最后一个数,也就是大于最大的数字,说明该数字可以与输入数组中i之前的LIS组成新的LIS,应当插入list末尾。
83+
2)nums[i]小于等于list中最后一个数,二分法找出并替换list中第一个大于nums[i]的数nums[j],这样相当于nums[i]可以加入j之前的LIS。
84+
85+
这样相当于同时统计多个IS,最后list中虽然可能不是某一个IS,但是长度一定与LIS相同。
86+
87+
*/
88+
89+
90+
public class Solution {
91+
/**
92+
* @param nums: The integer array
93+
* @return: The length of LIS (longest increasing subsequence)
94+
*/
95+
public int longestIncreasingSubsequence(int[] nums) {
96+
ArrayList<Integer> list = new ArrayList<Integer>();
97+
int max = 0;
98+
99+
if (nums == null || nums.length == 0) {
100+
return 0;
101+
}
102+
103+
for (int i = 0; i < nums.length; i++) {
104+
int left = 0;
105+
int right = list.size();
106+
int target = nums[i];
107+
108+
while (left < right) {
109+
int mid = (left + right) / 2;
110+
111+
if (list.get(mid) < target) {
112+
left = mid + 1;
113+
} else {
114+
right = mid;
115+
}
116+
}
117+
118+
if (right == list.size()) {
119+
list.add(target);
120+
} else {
121+
list.set(right, target);
122+
}
123+
}
124+
125+
return list.size();
126+
}
127+
}

0 commit comments

Comments
 (0)