当前位置: 首页 > news >正文

leetcode 704. 二分查找

leetcode 704. 二分查找

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

思路
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

#include <stdio.h>// 二分查找算法 左闭右闭区间 [left, right]
int search(int* nums, int numsSize, int target) {int left=0,mid,right=numsSize-1;//左闭右闭区间 [left, right]while(left<=right) //左闭右闭区间,left == right是有意义的{mid=left + ((right - left) / 2);//防止两个数很大时,加法溢出if(nums[mid]==target)return mid;else if(nums[mid]<target)left=mid+1;else right=mid-1;}return -1;
}
int main()
{int nums[]={-1,0,3,5,9,12};int target=9,ret;ret=search(nums,sizeof(nums)/sizeof(nums[0]),target);if(ret==-1)printf("%d not found\n",target);elseprintf("%d found at index %d\n",target,ret);return 0;
}

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

思路:
要在数组中插入目标值,无非是这四种情况
在这里插入图片描述

  • 目标值在数组所有元素之前
  • 目标值等于数组中某一个元素
  • 目标值插入数组中的位置
  • 目标值在数组所有元素之后
#include <stdio.h>/* 分别处理如下四种情况目标值在数组所有元素之前  返回插入0位置 return left=0目标值等于数组中某一个元素  return middle;目标值插入数组中的位置 [left, right],return  left目标值在数组所有元素之后的情况 [left, right],  return left(left=numsSize)*/
int searchInsert(int* nums, int numsSize, int target) {int left=0,right=numsSize-1;while(left<=right){int mid=left + (right - left) / 2; //防止溢出 (right+left)/2=(right-left+2*left)/2if(nums[mid]==target)return mid;else if(nums[mid]<target){left=mid+1;}else{right=mid-1;}}return left;//返回left满足以上情况
}
int main()
{int nums[]={1,3,5,6};int ret=searchInsert(nums,sizeof(nums)/sizeof(nums[0]),7);printf("%d\n",ret);return 0;
}

http://www.mrgr.cn/news/81192.html

相关文章:

  • 从 x86 到 ARM64:CPU 架构的进化与未来
  • 点亮核心板小灯 STM32U575
  • 计算机网络——练习题
  • 网络中冗余备份
  • Rust使用国内源加速在线安装开发环境搭建
  • Android -- 双屏异显之方法二
  • 【星海随笔】高级系统编辑
  • ARP协议的工作原理
  • 双足机器人《荣耀机甲H1》到手体验
  • docker下载镜像设置
  • 重温设计模式--备忘录模式
  • 谷歌开发者工具-元素篇
  • 重温设计模式--状态模式
  • ArrayList类 (顺序表)
  • Linux的VIM基本操作
  • 两台主机传送数据: transfer files between servers使用rsync命令
  • Linux网络——UDP的运用
  • UE5 移植Editor或Developer模块到Runtime(以运行时弹窗为例)
  • Dapper
  • C++设计模式:组合模式(公司架构案例)
  • 【IC】TSMC先进工艺发展历程--从N5到A16,从A16到未来
  • 某尝准app请求体响应加密分析
  • 多行为级联24|多行为推荐的超图增强级联图卷积网络
  • HashMap源码深度解析
  • CentOS HTTPS自签证书访问失败问题的排查与解决全流程
  • SpringCloud 运用(2)—— 跨服务调度