Java二分算法题目练习

Java二分算法题目练习

二分算法

二分查找

在这里插入图片描述
题目解析:在一个有序数组中找一个target ,找到返回其下标,找不到返回-1
算法原理:1.暴力解法:遍历整个数组进行查找时间复杂度O(N)
2.朴素二分算法:我们可以发现其数组是可以根据一个值将其分为两部分并且可以比较然后舍弃一部分,此时这个数组具有“二段性”,因此可以使用二分算法
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
classSolution{publicintsearch(int[] nums,int target){//此时就用left和right两个变量在左右两边//使用mid来表示其中间的下标,因为其有序//这样我们每次比较一次其就会干掉一半的数这个效率是很高的int left =0;int right = nums.length -1;while(left <= right){int mid = left +(right - left)/2;//防溢出if(target > nums[mid]){//在[mid+1 , right] left = mid +1;}elseif(target < nums[mid]){//在[left,mid - 1] right = mid -1;}else{return mid;}}return-1;}}
时间复杂度:O(log N )
空间复杂度:O(1)

在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述
题目解析:就是给了我们一个target,让我们在一个非递减的数组中找其开始和结束下标,并返回,如果找不到就返回[-1,-1]
解法一:暴力解法 ,时间复杂度O(N)
解法二:朴素二分查找,由于我们不确定找的数是其开始和结束位置,因此有可能全部遍历,因此时间复杂度是O(N)
解法三:左右二分算法
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
classSolution{publicint[]searchRange(int[] nums,int target){int[] ret =newint[2]; ret[0]= ret[1]=-1;if(nums.length ==0){return ret;}int left =0;int right = nums.length -1;//先左边二分while(left < right){int mid = left +(right - left)/2;if(nums[mid]< target){ left = mid +1;}else{ right = mid;}}//此时left与right相遇就会结束if(nums[left]!= target){return ret;}//反之就找到了左端点 ret[0]= left; left =0;//可以不用重置,因此此时上面left对应就是其开始位置 right = nums.length -1;while(left < right){int mid = left +(right - left +1)/2;if(nums[mid]> target){ right = mid -1;}else{ left = mid;}} ret[1]= right;return ret;}}

x的平方根

在这里插入图片描述
在这里插入图片描述
classSolution{publicintmySqrt(int x){//此时如果x<1,此时只保留整数,就是0if(x <1){return0;}//防止数据超出long left =1;long right = x;while(left < right){long mid = left +(right - left +1)/2;if(mid * mid <= x){ left = mid;}else{ right = mid -1;}}return(int)left;}}

搜索插入位置

在这里插入图片描述
题目解析:在一个无重复元素的升序数组中找出其目标值的位置,但是可能不存在,不存在的话就返回其按顺序插入的位置
二分算法:因为其可以将其数组分为>= target和<target的两部分,并且可以舍弃<target这个部分,因此使用二分算法,并且还是当left 等于 right结束
在这里插入图片描述
classSolution{publicintsearchInsert(int[] nums,int target){//使用二分算法int left =0;int right = nums.length -1;while(left < right){int mid = left +(right - left)/2;if(nums[mid]< target){ left = mid +1;}else{ right = mid;}}//注意此时可能从头到尾都是< targetreturn nums[right]< target ? right +1: right;}}

山脉数组的峰顶索引

在这里插入图片描述
题目解析:在一个一边递增,另一边递减的数组中找出其最大值
因此只需要找出其递增和递减中间的值下标就可以
在这里插入图片描述
class Solution { publicint peakIndexInMountainArray(int[] arr) { //因为其山脉我们呢可以分为两部分//峰值左边是递增的//峰值右边是递减的intleft=0;intright= arr.length -1;while(left<right){ int mid =left+(right-left+1)/2;if(arr[mid -1]< arr[mid]){ left= mid; }else{ right= mid -1; } } returnleft; } } 

寻找峰值

在这里插入图片描述
题目解析:在一个数组中,找其峰值,并且可能有多个,只需返回任意一个就行
二分算法:因为其是必然有峰值的,并且是不存在两个元素相同,因此其会出现两种情况,要么是递增,要么递减,因此按照分类使用二分算法
在这里插入图片描述


在这里插入图片描述
class Solution { publicint findPeakElement(int[] nums) { intleft=0;intright= nums.length -1;while(left<right){ int mid =left+(right-left)/2;if(nums[mid]> nums[mid+1]){ right= mid; }else{ left= mid +1; } } returnleft; } } 

寻找旋转排序数组中的最小值

在这里插入图片描述
题目解析:原本一个自增的数组,经过旋转,让我们找出其最小的值
算法原理:暴力解法:直接遍历找最小值
二分算法:我们可以以最后一个下标的值为基准值,因此数组可以分为两个部分,一半是>nums[n-1],一半是 <= nums[n - 1],就这样根据二段性就可以使用二分算法\
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
classSolution{publicintfindMin(int[] nums){int right = nums.length -1;int n = right;int left =0;while(left < right){int mid = left +(right - left)/2;if(nums[mid]> nums[n]){ left = mid +1;}else{ right = mid;}}return nums[left];}}

点名

在这里插入图片描述
题目解析:就是一个递增的数组,并且其下标和其对应的值是对应的,中间缺了一个数导致其不对应了,我们要找到这个数
在这里插入图片描述
//哈希classSolution{publicinttakeAttendance(int[] records){//使用hashSet<Integer> set =newHashSet<>();for(intrecord: records){ set.add(record);}//先全部将其放入hash中,让后一个一个判断其是否在其中就行int len = records.length;for(int i =0; i < len;i++){if(!set.contains(i)){return i;}}//缺少最后一个return len;}}
//直接遍历classSolution{publicinttakeAttendance(int[] records){//直接遍历for(int i =0;i < records.length;i++){if(records[i]!= i){return i;}}return records.length;}}
//求和classSolution{publicinttakeAttendance(int[] records){//使用求和方式也可以int len = records.length;int sum = len *(len +1)/2;for(int i =0;i < len ;i++){ sum -= records[i];}return sum;}}
//位运算classSolution{publicinttakeAttendance(int[] records){//使用位运算符^int ret =0;for(int i =0;i <records.length; i++){ ret ^= records[i]^ i;//此时最后一个下标没有异或}return ret^records.length;}}
//二分算法classSolution{publicinttakeAttendance(int[] records){//此时就可以将其数字分为两个部分//一部分是其值和下标一样//另一部分是不一样int left =0;int right = records.length -1;while(left < right){int mid = left +(right - left)/2;if(records[mid]== mid){ left = mid +1;}else{ right = mid;}}return records[left]== left ? left +1: left;}}

Read more

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,ZEEKLOG全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。 所属的专栏:Rust语言通关之路 景天的主页:景天科技苑 文章目录 * Rust Web开发 * 一、Actix Web框架概述 * 1.1 Actix Web的特点 * 1.2 Actix Web与其他Rust框架比较

By Ne0inhk
离开舒适区之后:从三年前端到 CS 硕士——我在韩国亚大读研的得失

离开舒适区之后:从三年前端到 CS 硕士——我在韩国亚大读研的得失

过去一年多,我做了一个挺重要的决定:辞职,去韩国留学读研。 这段时间我几乎没怎么学习新的前端内容,但也没有停下来。我在韩国亚洲大学完成了计算机科学与技术(大数据)硕士的学习,在高强度的节奏里重新建立了自己的方法,也因为持续写博客获得了一些机会,担任本科 Web 实训课讲师。现在这段留学告一段落,我也准备重新回到前端领域,把这段经历当作一份额外的积累带回去。这篇复盘主要是想把这一路的收获、疲惫和一些值得记住的瞬间记录下来,留给未来的自己,也分享给路过的你。 文章目录 * 1、写在前面:我为什么会从前端转去读研 * 2、留学生活的关键词:卷、AI、被看见以及校庆的“放开玩” * 3、我的“结果卡片” * 4、得:这一年半我真正收获的东西 * 5、失:我付出的代价 * 6、期末周:我经历过的“高强度交付周” * 7、前端三年经验,如何在读研里“迁移复用” * 8、我在韩国的学习系统:

By Ne0inhk
【前端进阶之旅】50 道前端超难面试题(2026 最新版)|覆盖 HTML/CSS/JS/Vue/React/TS/ 工程化 / 网络 / 跨端

【前端进阶之旅】50 道前端超难面试题(2026 最新版)|覆盖 HTML/CSS/JS/Vue/React/TS/ 工程化 / 网络 / 跨端

文章目录 * 前言 * 一、原生开发(HTML/CSS/JavaScript) * 二、框架核心(Vue2/3、React16/18/19) * 三、网络协议 * 四、工程化 * 五、跨端开发(uniapp、uniappX) * 六、TypeScript * 写在最后 前言 作为前端开发者,想要突破中高级面试瓶颈,仅掌握基础语法远远不够 —— 大厂面试更侧重底层原理、手写实现、场景分析与跨领域综合能力。本文整理了50 道无答案版前端超难面试题,覆盖原生开发、框架核心、网络协议、工程化、跨端开发、TypeScript 六大核心方向排序且聚焦高频难点,适合自测、复盘或作为面试出题参考,建议收藏反复琢磨! 一、原生开发(HTML/CSS/JavaScript) 原生能力是前端的根基,

By Ne0inhk
Flutter 三方库 web_scraper 轻量级网页抓取核心适配进阶:精通跨端选择器表达式无头浏览器代理、极限提取残缺数据接口网格实现鸿蒙万物互联泛信息-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 web_scraper 轻量级网页抓取核心适配进阶:精通跨端选择器表达式无头浏览器代理、极限提取残缺数据接口网格实现鸿蒙万物互联泛信息-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 web_scraper 轻量级网页抓取核心适配进阶:精通跨端选择器表达式无头浏览器代理、极限提取残缺数据接口网格实现鸿蒙万物互联泛信息即时采集 前言 在 OpenHarmony 应用开发中,我们并非总能获得完美的后端 API。当我们希望在鸿蒙应用中聚合一些公开的技术资讯、天气指数或是论坛热帖,但对方并未提供标准化 JSON 接口时,通过抓取网页(Web Scraping)获取结构化数据成了唯一的出路。web_scraper 库为 Flutter 开发者提供了一套基于 CSS 选择器的极简网页爬虫方案。本文将实战介绍如何在鸿蒙端利用该库构建一个高效的信息采集底座。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 web_scraper 的核心逻辑是基于 HTTP 内容请求与 HTML DOM 树的解析映射。

By Ne0inhk