算法学习笔记【1】——二分查找

目录

前言

一、二分查找是什么?

二、算法思路及应用

1.算法思路

2.算法应用【1】leetcode真题

【2】猜数字

三、还未解决的问题

总结


前言


算法学习从二分查找开始,初步从三个方面认识二分查找:简介、思路及应用。

一、二分查找是什么?


二分查找是对有序数组进行的,可分为递归和非递归两种类型。按照关键词有序排列,其时间复杂度为0(logn)

作用可分为三种:1、查找确切值。2、查找比某个数大的临界值。3、查找比某个数小的临界值。

二、算法思路及应用


1.算法思路


【1】输入前提条件
 

for( left = 0,right = nums.size() - 1;left <= right;){}

【2】首先确定该数组的中间的下标,选择第二种格式,因为第一种可能造成数值的溢出;
 


int mid = (left + right)/2;
int mid = (right - left)/2 + left ;

也可选择>>1替代/2 的形式,C++中的关于/2和>>1的区别
1.操作对象类型不同
>>是右移符有号(只允许整数)
/ 除号(可以操作不同数据类型)浮点数除法最终为浮点数,整数除法最终为整数

注意:只有在操作数被告知为大于0的整数时才可以用

2.运算效率不同

>>快  /慢(涉及浮点数的除法速度最慢)

3.优先级不同
>>优先级低

【2】然后让需要查找的数target和nums [mid]比较
 


if (target == nums[mid])
{
return target;
}
if (target < nums[mid])
{
return mid - 1;
}
if(target > nums[mid])
{
return mid + 1;

2.算法应用
【1】leetcode真题

给定一个n个元素有序的(升序)整数数组nums和一个目标值target,写一个函数搜索nums 中的target ,如果目标值存在返回下标,否则返回-1.

代码如下(示例):

注意:

(1).

endl的最后是字母l 而不是1,也不是大写的I 

endl要和cout 搭配使用,意为输出语句

endl 英文含义(end and line)

(2).

return 0;要放在最后不能放在前面,要不提前执行了。
 


#include <iostream>
#include<iomanip>
#include <vector>
using namespace std;
class Solution {
public:
	int search(vector<int>& nums, int target) {
		int left = 0, right = nums.size( ) - 1;
		while (left <= right) {
			int mid = (right - left) /2  + left;
			int num = nums[mid];
			if (num == target) {
				return mid;
			}
			else if (num > target) {
				right = mid - 1;
			}
			else  {
				left = mid + 1;
			}
		}
		return -1 ;
	}

【2】猜数字
 

小丁从1-100之间,选一个数,让小米猜,小丁告诉小米是大了还是小了,或着猜中了

小胖要猜多少次?


#include <iostream>
#include<iomanip>
using namespace std;
 
int search(int nums[], int size, int target ){
	int left = 0, right = size - 1;
	int i = 1;
	int mid;
 
	while (right >= left) {
		mid = ((right - left) >> 1) + left;
		cout << "第" << i++ << "次猜:" << nums[mid] << endl;
 
		if (nums[mid] == target) {
			return nums[mid];
		} else if (nums[mid] > target) {
			right = mid - 1;
		}
		else {
			left =mid + 1;
		}
	}
	return 0;
}
int main() {
	int  nums[100];
	int target;
	for (int i = 0; i < 100; i++) {
		nums[i] = i + 1;
	}
	cout << "请输入一个1——100之间的数" << endl;
	cin >> target;
	if (search(nums, 100, target) != 0) {
		cout << "找到了" << endl;
 
	}
	else {
		cout << "没找到" << endl;
	}
}

运行结果显示

 

三、还未解决的问题

leetcode那道题的主函数部分不会写,有会写的吗?

 

总结

以上就是今天要学习的算法内容,本文简单介绍了二分查找的算法思路和应用


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓凡魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值