LeetCode - 268. Missing Number & 674. Longest Continuous Increasing Subsequence
阿新 • • 發佈:2019-01-07
LeetCode - 268. Missing Number & 674. Longest Continuous Increasing Subsequence
LeetCode - 268. Missing Number
題目連結
題目
解析
題目要求在O(n)
時間和O(1)
空間內完成。
也是一個很有意思的題目,簡單的想法:
- 用一個變數
sumAll
- 然後求出陣列的和
sum
,結果就是sumAll - sum
;
更好的解法,利用亦或的性質:
利用第四條性質,迴圈亦或xor = xor ^ (i+1) ^ nums[i]
其中沒有出現的數就會剩下來。
class Solution {
public int missingNumber(int[] nums) {
int sumAll = 0, sum = 0;
for(int i = 0; i < nums.length; i++){
sumAll += (i+1);
sum += nums[i];
}
return sumAll-sum;
}
}
用等差數列求和公式求出sumAll
:
class Solution {
public int missingNumber(int[] nums) {
int sumAll = (0+nums.length)*(nums.length+1)/2; //等差數列
int sum = 0;
for(int i = 0; i < nums.length; i++)
sum += nums[i];
return sumAll-sum;
}
}
更加巧妙的方式,利用異或運算:
class Solution {
public int missingNumber(int[] nums) {
int xor = 0;
for(int i = 0; i < nums.length; i++)
xor = xor ^ (i+1) ^ nums[i];
return xor;
}
}
LeetCode - 674. Longest Continuous Increasing Subsequence
題目連結
題目
求最長連續遞增子串(不是子序列)。
解析
比最長遞增子序列更簡單,同樣提供三種解法。
一維dp
class Solution {
public int findLengthOfLCIS(int[] nums) {
if(nums == null || nums.length == 0)
return 0;
int res = 1;
int[] dp = new int[nums.length];
dp[0] = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] > nums[i-1])
dp[i] = dp[i-1] + 1;
else
dp[i] = 1;
res = Math.max(res, dp[i]);
}
return res;
}
}
記憶化遞迴:
class Solution {
public int res;
public int findLengthOfLCIS(int[] nums) {
if(nums == null || nums.length == 0)
return 0;
int[] dp = new int[nums.length];
Arrays.fill(dp, -1);
res = 1;
process(nums, nums.length-1, dp);
return res;
}
public int process(int[] nums, int i, int[] dp){
if(i == 0)
return 1;
if(dp[i] != -1)
return dp[i];
if(nums[i] > nums[i-1]){
dp[i] = process(nums, i-1, dp) + 1;
}else {
dp[i] = 1;
process(nums, i-1, dp); // still should
}
res = Math.max(res, dp[i]);
return dp[i];
}
}
滾動優化
class Solution {
public int findLengthOfLCIS(int[] nums) {
if(nums == null || nums.length == 0)
return 0;
int res = 1, cur = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] > nums[i-1])
cur += 1;
else
cur = 1;
res = Math.max(res, cur);
}
return res;
}
}