lower_bound(arr.begin(),arr.end(),val):在一个从小到大排好序的数组arr的[begin,end)区间通过二分查找返回第一个大于等于val的位置。
upper_bound(arr.begin(),arr.end(),val):在一个从小到大排好序的数组arr的[begin,end)区间通过二分查找返回第一个大于val的位置。
lower_bound(arr.begin(),arr.end(),val,greater<int>):在一个从大到小排好序的数组arr的[begin,end)区间通过二分查找返回第一个小于等于val的位置。
upper_bound(arr.begin(),arr.end(),val,greater<int>):在一个从大到小排好序的数组arr的[begin,end)区间通过二分查找返回第一个小于val的位置。
方法一:
DP(动态规划)
class Solution {
public:
vector<int> dp;
int lengthOfLIS(vector<int>& nums) {
int ret=0;
int len=nums.size();
dp.resize(len);
int i,j;
for(i=0;i<len;i++)
{
int m=-1;
for(j=0;j<i;j++)
{
if(nums[j]<nums[i])
{
if(dp[j]>m)
{
m=dp[j];
}
}
}
if(m==-1)
{
dp[i]=1;
}
else
{
dp[i]=m+1;
}
if(dp[i]>ret)
{
ret=dp[i];
}
}
return ret;
}
};
方法二:
lower_bound(二分)
class Solution {
public:
vector<int> arr;
int lengthOfLIS(vector<int>& nums) {
int len=nums.size();
int i;
for(i=0;i<len;i++)
{
vector<int>::iterator it=lower_bound(arr.begin(),arr.end(),nums[i]);
if(it==arr.end())
{
arr.push_back(nums[i]);
}
else
{
arr.erase(it);
arr.insert(it,nums[i]);
}
}
return arr.size();
}
};
欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓