在一个有序数组里找到一个数字K【二分查找法】

数组题 1.数组乱序 var arr = [1,2,3,4,5,6,7,8,9]; //这种算法,适合面对面笔试。 var newArr = []; while(arr.length > 0) { var num = Math.floor(Math.random() * arr.length); newArr.push(arr[num]); arr.splic... 阅读详情

目录

思路分析

上代码


思路分析

表达有序数组:arr[ ]={1,2,3,4,5,6,7,8,9,10};

假定查找数字5,需要知道5在数组arr[ ]中的下标,下标应为4,即arr[4]

求数组元素个数:int sz = sizeof(arr) / sizeof(arr[0]);//数组空间的大小除以数组一个元素的大小

最左边下标表示为:int left = 0;

最右边下标表示为:int right = sz-1;//数组元素个数-1

查找数:k;

二分中间下标:mid;

二分中间数:arr[mid];

 每一次二分查找时,找到中间下标,用中间下标 mid 表示的数字 arr[mid] 与查找数 k 比大小。

若arr[mid]>k,继续二分查找,则右下标向左移动,right = mid-1;

若arr[mid]<k,继续二分查找,则左下标向右移动,left = mid+1;

若arr[mid]=k,那么就找到了数字k。

注意,这一切的前提是left<=right;若left>right,则不可能找到k。

上代码

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz-1;
	int k = 0;
	scanf("%d", &k);

	while (left<=right)
	{
		//int mid = (left + right) / 2;
    	int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到\n");

	return 0;
}

可以看见,除了我们知道的(left+right)/2=mid,还有一种方法求mid,如下图

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

一个有序数组中两个值相加为k的数字,返回这两个数字的下标。(腾讯面试题) 题目要求:求一个有序数组中两个值相加为k的数字,返回这两个数字的下标。找到返回正常的下标,查找失败返回-1 分析: 有序的数组(假设非降序),采取双向遍历,一个从前往后,一个从后往前,当前数字相加如果相等则返回,如果小于k则前面的继续往后,如果大于k则后面的继续往前 typedef struct Pairs { int x;//第一个数的下标 int y;//第二个数的下标 }P... 阅读详情

相关推荐

二分查找法(在一个有序数组查找具体某个数字n)

二分查找——在一个有序数组查找某个数字n

Llllll~的博客 721

C++021-C++二分查找

本系列为C++学习系列,会介绍C++基础语法,基础算法数据结构的相关内容。本文为C++中的二分查找案例,包括相关案例练习。

IT从业者的成长历程 672

Java实现 LeetCode 4 寻找两个有序数组的中位数

寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4...

南 墙 1万+

C语言——实现一个整型有序数组的二分查找的两种方法

C语言——实现一个整型有序数组的二分查找的两种方法

m0_49687898的博客 2449

基础算法二分查找c语言

在 1 2 3 4 5 6 7 8 9 10 查找7 和 17 1.把数据存放在数组中并且把7和17分两次需要输入的k值定义并且接受 int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k; scanf("%d", &k); 2.找出数组两边的下标 1>计算数组长度 int sz = sizeof(arr) / sizeof(arr[0]); 2> int left = 0; int right = sz - 1; 3.在数组中查找是否有k 1>先.

weixin_66409969的博客 589

C语言:写一个函数,实现一个整型有序数组的二分查找

使用C语言:写一个函数,实现一个整型有序数组的二分查找。包含题目、分步骤思路、最终实现代码 和 最终实现效果。

正在努力学C呀!(要学好久呢......) 906

一个有序的数组中查找一个数字二分查找法

对于同博主一样刚入门不久的,遇到二分查找法是否也总是一学就会,一写就废,今天就来为大家来详解一下二分查找,巩固知识的同时希望本文能对大家有帮助。

干脆面la的博客 6432

C语言实现,在一个有序数组查找一个数字详解折半(二分)详解(*算法*)

关于在一个有序数组查找一个数字详解折半(二分)(算法) 分两种算法一种普通算法一个一个遍历和,折半(二分)查找法 文章结构关于在一个有序数组查找一个数字详解折半(二分)(*算法*)一、普通方法二、二分查找法(折半查找法)1.一半再分一半原理总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、普通方法 遍历法这种一个一个遍历一个一个判断然后得到下标 int arr[] = { 1,2,3, 4,5,6,7,8,9, 10 }; int k = 7; //写一个代码,在arr数组(有序的

Alicesa的博客 1165

如何用二分查找法查找有序数组

C语言中,二分查找法一个有序数组查找具体的某个数字n #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int v[10] = { 0,1,2,3,4,5,6,8,9 };//定义一个数组 int sz=sizeof(v)/sizeof(v[0]) ;//计算元素个数 int k = 7;//定义查找数字 int left = 0;//左下标初始值 int right =sz-1;//右下标初始值,元素个数减一

weixin_43738789的博客 1774

有序数组查找具体数字n(二分查找

题目 在一个有序的数组中查找具体的某个数字n,编写功能:在v[0]<=v[1]<…<v[n-1]的数组中查找数字的下标 思路(一) 我们先定义一个有序的数组arr,再设置一个数组中的一个数字k为我们所寻找的值,当数字算法结果匹配时,打印“找到了,下标为–”,若该数字在数组中未查找到,则打印“找不到”。 因为该数组是有序的,我们可以利用一个循环结构,当i<sz时,数组中元素的下标i(每次下标加一),在数组中进行逐个查找,当k=arr[i]找到数字,打印“找到了,下标为i”。当i=s

rain67的博客 4113

判断一个有序数组一个数字重复出现的次数

判断一个有序数组一个数字出现的次数 首先可以想到二分法,但是二分法只是找到其中一个的位置,这个时候不能确定个数 为了能够确定个数,可以有一个简单的方法,一个一个往前数,一个一个往后面数,直到数到边界为止,代码如下 class Solution { public: int GetNumberOfK(vector&lt;int&gt; data ,int k) { ...

小熊不哭站起来撸 4615

二分查找法,查找有序数组中的数字(非常重要)

感谢B站大神鹏哥的无私教导

QuSheng_c的博客 508

C语言一个有序数组,插入一个数,并且使数组顺序不变

这是要有序数列,在此基础之上插入一个数字,使其顺序不变,首先我们需要知道我们怎么样插入才能让他顺序不变,那么我们需要进行比较,可以看看下面的这张图我们这定义了一个数组可以存放7位数,但我们只放了6位,那是因为我们需要插入一个新的数,那么在这个数之后的数就要都向后移动一位形成新的数组,也可以理解为给新输入的数据一个存放空间假如说我们输入要插入的数为5原始数组为那么我们可以从数组最后面,也就是从数组中最大的7开始比较7大于5那么7向后移动一位变成这样。

2302_80245587的博客 4460

合并k个有序数组

题目: 合并k个有序数组。 分析: 利用一个大小为k的小根堆(代码用multiset表示),每次取堆顶的数字,直到大根堆为空。 struct node { vector>* ptr; int i; int j; node(vector>* p, int a, int b) :ptr(p), i(a), j(b) {} }; struct compare { bool

bupt8846的专栏 2573

合并K个有序数组

堆排序

听了个听儿 1万+

C语言程序设计基础:关于如何在一个有序数组中找出目标数字的下标

C语言关于如何在一组有序数组中找出目标数字的下标

quellen的博客 2962

LeetCode 查找和最小的K対数字

给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。 示例 1: 输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3 输出: [1,2],[1,4],[1,6] 解释:...

hestyle的博客 1322
下一篇: JAVA 类与对象 详解
爱花草的风景猫
博客等级 码龄5年 5粉丝 6原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值