Leetcode704:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int l, r, mid;
l = 0, r = nums.size();//左闭右开,与结束循环条件l<r相对应
while (l < r) {
mid = (l + r) / 2;
if (nums[mid] >= target)
{
//由于这种二分方法是利用l+1避免无限循环,因此r=mid的判定条件是合法即可(即加上等于号)
//因为r不会+1,会一直将搜索结果保留在区间内
r = mid;
}
else
{
l = mid + 1;
}
}
if (l >= 0 && l < nums.size() && nums[l] == target)
return l;
else
return -1;
}
};
Leetcode 209
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的
子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
典型的二分搜索答案类型题。以最终答案长度作为二分搜索的目标进行搜索。
class Solution {
public:
bool check(int mid, int target, vector<int>& nums)
{
int sum = 0;
for(int i = 0;i<mid;i++)
{
sum += nums[i];
}
if(target<=sum)
return true;
for(int i = mid;i<nums.size();i++)
{
sum+=nums[i];
sum-=nums[i-mid];
if(target<=sum)
return true;
}
return false;
}
int minSubArrayLen(int target, vector<int>& nums)
{
int sum = 0;
for(int i = 0;i<nums.size();i++)
{
sum += nums[i];
}
if(target>sum)
return 0;
int l,r,mid;
l = 1,r = nums.size();
while(l<r)
{
mid=(l+r)/2;
if(check(mid,target,nums))
{
r = mid;
}
else l = mid + 1;
}
return l;
}
};
这道题还可以使用双指针,代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int l,r;l=r=0;
int sum = 0;
int ans = INT_MAX;
while(r<nums.size())
{
sum += nums[r];
if(sum>=s)
{
while(sum>=s)
{
sum-=nums[l];
l++;
}
ans = min(ans,r-l+2);
}
r++;
}
if(ans==INT_MAX)
return 0;
else return ans;
}
};