首页 > 其他分享 >二分法的四个简单应用

二分法的四个简单应用

时间:2022-10-04 11:31:21浏览次数:59  
标签:arr right int 元素 mid 二分法 应用 四个 left

一.寻找有序数组中的元素

--寻找一个有序数组中的某个元素,并输出其下标

//寻找有序数组中的某个元素
#include<stdio.h>
int main()
{
int arr[] = { -1,2,4,5,7,8,9,11 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0, n;
int right = sz - 1;
scanf("%d", &n);
while (left<=right)
{
int mid = left + (right - left) / 2;
if (arr[mid]>n)
{
right = mid - 1;
}
else if (arr[mid]<n)
{
left = mid + 1;
}
else
{
printf("找到了,该元素下标为%d\n", mid);
break;
}
}
if (left>right)
{
printf("无法找到该元素\n");
}
return 0;
}


二.有序二维数组的查找

--在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。输入一个数,判断二维数组中是否含有该元素,若有,输出其下标。


· ·将目标元素和右上角的元素进行比较。若目标元素小于右上角的元素,则该元素比右上角元素所在列的所有元素都小;若目标元素大于右上角的元素,则该元素比右上角元素所在行的所有元素都大。

二分法的四个简单应用_局部最小值

//2.二维数组查找
#include<stdio.h>
int main()
{
int arr[4][4] =
{ 2 ,3 ,4 ,5,
6 ,7 ,8 ,9,
10,11,12,13,
14,15,16,17 };
int row = 0;
int col = 3, n;
scanf("%d", &n);
while (n != arr[row][col] && row>=0 && row<4 && col>=0 && col<4)
{
if (arr[row][col]>n)
{
col--;
}
else
{
row++;
}
}
if (n == arr[row][col])
{
printf("找到了,该元素下标为%d %d\n", row, col);
}
else
{
printf("无法找到该元素\n");
}
return 0;
}


三.无序数组局部最小值查找

--求一个无序数组中的任意一个局部最小值,该数组中相邻两个元素都不相等

二分法的四个简单应用_旋转数组_02

#include<stdio.h>

int Check(int sz, int arr[])
{
int left = 0;
int right = sz - 1;
if (arr[left] < arr[left + 1])
{
return left;
}
else if (arr[right] < arr[right - 1])
{
return right;//判断两端
}
else//利用二分判断中间
{
while (left <= right)
{
int mid = left + (right - left) / 2;
if ((arr[mid] < arr[mid - 1]) && (arr[mid] < arr[mid + 1]))
{
return mid;
}
else if (arr[mid] < arr[mid - 1] && arr[mid]>arr[mid+1])
{
left = mid + 1;
}
else//(arr[mid]>arr[mid-1] && arr[mid]>arr[mid+1]) || (arr[mid]>arr[mid-1] && arr[mid]<arr[mid+1])
{
right = mid - 1;
}
}
}
}

int main()
{
int arr[] = { 9,8,9,7,5,2,3,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = Check(sz, arr);
printf("该数组存在一个局部最小值,该元素下标为%d\n", ret);
return 0;
}


四.旋转数组查找

--旋转数组的定义:

排好序的数组 nums 在某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

--给定一个旋转数组,找出其最小元素并输出其下标

二分法的四个简单应用_二分法_03

//旋转数组的查找
//找出一个旋转数组中的最小元素

#include<stdio.h>
int main()
{
int arr[] = { 5,6,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid]>arr[right])//在左半部分
{
left = mid + 1;
}
else if (arr[mid]<arr[right])//在右半部分
{
right = mid;//不能mid-1,因为mid很可能是最小值
}
else
{
printf("该数组最小元素下标为%d\n", right);
break;
}
}
return 0;
}

标签:arr,right,int,元素,mid,二分法,应用,四个,left
From: https://blog.51cto.com/u_15752114/5731161

相关文章

  • 构建Java高并发高性能分布式框架,高可维护性Java应用系统
    构建Java高并发高性能分布式框架,高可维护性Java应用系统微服务架构模式(MicroserviceArchitectPattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重......
  • 大模型系统和应用——Prompt-learning & Delta Tuning
    目录:​​自然语言处理&大模型基础​​​​神经网络基础​​​​Transformer&PLM​​PromptTuning&DeltaTuning高效训练&模型压缩基于大模型的文本理解与生成大模型与生......
  • 华为大数据开发平台 DataFactory 行业应用典型案例
    本文将基于华为大数据开发平台DataFactory实践数据仓库的快速构建,学会基于DataFactory实践数据仓库模型设计,体验DataFactory独特的数据流设计工具,最后实战一站式数据......
  • 驱动开发:应用DeviceIoContro开发模板
    内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典的......
  • 驱动开发:应用DeviceIoContro开发模板
    内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典......
  • 数据结构应用题
    数据结构应用题考点数组数组的存储结构一维数组A[0...n-1]为例,存储关系\[LOC(ai)=LOC(a0)+(i)×L(0≤i<n)\]L是每个数组元素所占存储单元多维数组对于多维数组,有两......
  • Mac安装软件打开应用提示已损坏解决方法
    Mac打开应用提示已损坏的解决方法10.15及以上新系统出现应用提示损坏打不开的解决方法:打开终端(屏幕下方Dock栏中的的小火箭图标“启动台”——“其他”——打开“终端......
  • Git之常见工程、应用、学习错误及安装问题
    Git之常见工程、应用、学习错误及安装问题​​什么是wiki(多人协作的写作系统)​​​​Git使用​​​​GitHub上传时,项目在已有文档时直接push出现错误解决方案​​......
  • 常见工程、应用、学习错误及安装问题之Python
    ​​pip临时使用国内镜像源​​​​python创建文件夹​​​​python读取文件下所有文件路径​​​​将numpy中的True/False转换成1/0​​​​使用python复制文件​​​​L......
  • 常见工程、应用、学习错误及安装问题之C#
    ​​vscode中使用c#​​​​C#的http使用​​​​C#中WinForm的界面未响应卡顿问题​​​​C#函数中(objectsender,EventArgse)参数是什么意思​​​​C#内存溢出的几种......