最长上升子序列问题(LIS, LeetCode 300)
class Solution {
public:
// O(N^2) Solution.
int lengthOfLIS1(vector<int>& nums) {
int dp[nums.size()+1], res=0;
for(int i=0;i<nums.size();i++) {
if(i==0) dp[i]=1;
else {
dp[i]=1;
for(int j=0;j<i;j++) {
if(nums[i]>nums[j]) dp[i]=max(dp[i], dp[j]+1);
}
}
res=max(res, dp[i]);
}
return res;
}
// O(N^log(N)) Solution.
int lengthOfLIS2(vector<int>& nums) {
int dp[nums.size()+1], len=0, mid, l, r;
for(int i=0;i<nums.size();i++) {
if(i==0) {
dp[++len]=nums[i];
continue;
}
if(nums[i]>dp[len]) dp[++len]=nums[i];
else {
l=1, r=len;
while(l<r) {
mid=(l+r)/2;
if(dp[mid]<nums[i]) l=mid+1;
else r=mid;
}
dp[l]=nums[i];
}
}
return len;
}
};
N皇后问题(LeetCode 52)
class Solution {
public:
int total=0;
bool is_ok(int row, int* c) {
for(int j=0;j<row;j++) {
if(c[row]==c[j] || abs(j-row)==abs(c[j]-c[row])) return false;
}
return true;
}
void queen(int row, int n, int* c) {
if(row == n) total++;
else {
for(int i=0;i<n;i++) {
c[row]=i;
if(is_ok(row, c)) queen(row+1, n, c);
}
}
}
int totalNQueens(int n) {
int* c=new int[n];
queen(0, n, c);
return total;
}
};
找到序列中的局部最大值(LeetCode 162)
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size()==1) return 0;
int l=0, r=nums.size()-1, mid;
while(l<=r) {
if(nums[l]>=nums[l+1]) return l;
if(nums[r]>=nums[r-1]) return r;
mid=(l+r)/2;
if(nums[mid]>nums[mid-1]) l=mid;
else if(nums[mid]<nums[mid-1]) r=mid;
}
return l;
}
};
大数求根
class Solution {
public:
int mySqrt(int x) {
int l=1, r=x, mid;
while(l<=r) {
mid=(l+r)/2;
if(mid==x/mid) return mid;
else if(mid<x/mid) l=mid+1;
else r=mid-1;
}
return r;
}
};