1.300. 最长递增子序列 - 力扣(LeetCode)
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();if(n == 0) return 0;vector<int> dp(n, 1);for(int i = 0; i < n; i++)for(int j = 0; j < i; j++)if(nums[j] < nums[i])dp[i] = max(dp[i], dp[j]+1);return *max_element(dp.begin(), dp.end()); }
};
对于数组中的每一个元素,可以假设它至少构成长度为1 的递增子序列(即自身)。当nums[j]大于nums[i]的时候,可以将nums[j] 加入到以nums[i] 为结尾的递增子序列中。
2.34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
class Solution {
public:int binsearch(vector<int> nums, int target) {int l = 0, r = nums.size() - 1;while(l <= r) {int mid = l + (r-l)/2;if(nums[mid] < target) l = mid + 1;else r = mid - 1;}return l;}vector<int> searchRange(vector<int>& nums, int target) {int st = binsearch(nums, target);if(st == nums.size() || nums[st] != target) return {-1, -1};int en = binsearch(nums, target+1) - 1;return {st, en};}
};
二分 一看就是二分。
3.744. 寻找比目标字母大的最小字母 - 力扣(LeetCode)
class Solution {
public:int binsearch(vector<char> nums, char target) {int left = 0, right = nums.size() - 1;while(left <= right) {int mid = left + (right - left) / 2;if(nums[mid] <= target) left = mid + 1;else right = mid - 1;}return left;}char nextGreatestLetter(vector<char>& letters, char target) {int res = binsearch(letters, target);if(res == letters.size() || letters[res] < target)return letters[0];return letters[res];}
};
注意,binsearch函数中是nums[mid] <= target
4.2529. 正整数和负整数的最大计数 - 力扣(LeetCode)
class Solution {
public:int binsearch(vector<int> &nums, int target) {int left = 0, right = nums.size() - 1;while(left <= right) {int mid = left + (right-left) / 2;if(nums[mid] >= target) right = mid - 1;else left = mid + 1;}return left;}int maximumCount(vector<int>& nums) {int neg = binsearch(nums, 0);int pos = (int)nums.size() - binsearch(nums, 1);return pos > neg ? pos : neg; }
};
不包括0,就从1开始找就好了啊