leetcode 二分查找-C++

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
这种问题有两种情况
一定要注意区间的界定,对于这种边界值的计算

  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;
}
  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;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值