File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ Time complexity O(n^2) or O(nlogn)
22
22
23
23
24
24
解:
25
+
26
+ 方法一:
25
27
dynanmic programming
26
28
27
29
dp[i]表示包含nums[i]在内的最长递增子序列。
@@ -65,3 +67,61 @@ public int longestIncreasingSubsequence(int[] nums) {
65
67
}
66
68
}
67
69
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
+ }
You can’t perform that action at this time.
0 commit comments