if条件判断
(1)使用“与”操作,要求所有表达式的判断结果都是TRUE才为真;若有一个为FALSE,那么最终判断结果则为FALSE。
(2)使用“或”操作,要求所有表达式的判断结果都是FALSE才为假;若有一个为TRUE,那么最终的结果则为TRUE。
35
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
思路
开始的时候看着道题,首先想到用二分查找法,但是题目中又有一个条件,找不到就要返回按顺序插入的位置
这个时候依然可以使用二分查找的方法,只不过我们找的位置是第一个大于等于target的位置,这样就可以解决。
class Solution{
public:
int Search(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
int ans=nums.size();//是为了因对一些特殊情况,
比如target大于所有的数,那么就要插入到最后,所以需要比数组长度大一
int middle;
while(left<=right)
{
middle=(left+right)/2;
if(target<=nums[middle])
{
right=middle-1;
ans=middle;
}
else
{
left=middle+1;
}
}
return ans;
}
};
与这个题相类似的还有
比如超照一个有序数组中的某一个元素,找到返回下标,找不到返回-1
这种问题有两种情况
一定要注意区间的界定,对于这种边界值的计算
- 左闭右闭
主要算法
int search(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
int middle;
while(left<=right)
{
middle=(right+left)/2;
if(target<nums[middle])
{
right=middle-1;
}
else if(target>nums[middle])
{
left=middle+1;
}
else
return middle;
}
return -1;
}
- 左闭右开 [ , )
说明最右面的值是取不到的
int search(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
int middle;
while(left<right) //这里是小于
{
middle=(left+right)/2;
if(target<nums[middle])
{
right=middle; //右边是开区间
}
else if(target>nums[middle])
{
left=middle+1;
}
else{
return middle;
}
}
return -1;
}
34
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
思路:对于这个题,首先想到就是找到第一个位置和最后一个位置,那么有当出现一个数大于等于target,表示找到第一个等于target的数,当出现第一个大于target的数,那么这个数的前一个就是最后一个等于target的数。
所以程序如下
class Solution
{
public:
int binarySearch(vector<int>&nums,int target,bool lower){
int left=0;
int right=nums.size()-1;
int middle;
int ans=nums.size();
while(left<=right)
{
middle=(left+right)/2;
if(nums[middle]>target || lower && nums[middle] >=target )
{
right=middle-1;
ans=middle;
}
else
left=middle+1;
}
return ans;
}
vector<int> SearchRange(vector<int>&nums, int target)
{
int leftidx=binarySearch(nums,target,true);
int rightidx=binarySearch(nums,target,false)-1;
if(leftidx<=rightidx && rightidx < nums.size() && nums[leftidx]==target && nums[rightidx]==target)
{
return vector<int>{leftidx,rightidx};
}
else
return vector<int>{-1,-1};
}
};
69
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
思路:可以通过
class Solution
{
public:
int MySqrt(int x){
int left=0,r=x,mid;
int result;
while(left<=right){
mid=(left+right)/2;
if((long long )mid*mid<=x)
{
left=mid+1;
result=mid;
}
else
right=mid-1;
}
}
return result;
}
367
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
提示:
1 <= num <= 2^31 - 1
思路:和上面一样还是要用二分法
class Solution{
bool isPerfectSquare(int num)
{
long left=0,right=num/2;
int middle;
while(left<=right)
{
middle=(left+right)/2;
if(middle*middle==num)
{
return true;
}
if(middle*middle>num)
{
right=middle-1;
}
else
{
left=middle+1;
}
}
return false;
}
};