面试 Java 算法高频题五问五答第二期

面试 Java 算法高频题五问五答第二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!

⭐点赞⭐收藏⭐不迷路!⭐

寻找峰值:

主要思想:二分查找,利用get函数,方便判断越界情况,如果没越界返回的是1和nums[index],如果越界返回0,0.Compare函数,用于比较nums,index1,index2两个数的大小情况,如果得到get后,第一个索引不同,return nums[0]>nums[0]1:-1,如果第二个索引相同返回0,return nums[1]>nums[1]1:-1;

主函数:用compare判断是否属于峰值,mid-1,mid<0说明mid>mid-1,mid,mid+1>0,说明mid>mid+1,if(comapre(nums,mid,mid+1)>0) 左边大于右边,抛弃右边 right = mid-1;

class Solution {public int findPeakElement(int[] nums) {int left = 0;int right = nums.length-1;int result = 0;while(left<=right){int mid = (left+right)>>1;if(compare(nums,mid-1,mid)<0&&compare(nums,mid,mid+1)>0){result = mid;break;}if(compare(nums,mid,mid+1)>0){right = mid-1;}else{left = mid+1;}}return result;}public int[] get(int [] nums,int index){if(index<0||index>=nums.length){return new int []{0,0};}return new int []{1,nums[index]};}public int compare(int []nums,int idx1,int idx2){int[] nums1 = get(nums,idx1);int [] nums2 = get(nums,idx2);if(nums1[0]!=nums2[0]){return nums1[0]>nums2[0]?1:-1;}if(nums1[1]==nums2[1]){return 0;}return nums1[1]>nums2[1]?1:-1;}
}

搜索旋转排序数组:

主要思想:因为左右各一边是升序,因此先判断nums[mid]是否等于target,如果等于直接返回,如果然后判断mid和left,区别哪边有序,再判断target在有序的一边还是无序的一边,如果mid==left,left++;

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length-1;while(left<=right){int mid = (left+right)>>1;if(nums[mid]==target){return mid;}if(nums[mid]>nums[left]){if(target>=nums[left]&&target<nums[mid]){right = mid-1;}else{left = mid+1;}}else if(nums[mid]<nums[left]){if(nums[mid]<target&&target<=nums[right]){left = mid+1;}else{right = mid-1;}}else{left++;}}return -1;}
}

做菜顺序:

主要思想:贪心算法,先将数组进行降序,然后记录preSum,和sum,如果preSum+nums[i]>0那么 preSum+=nums[i] ,sum+=preSum;

class Solution {public int maxSatisfaction(int[] satisfaction) {Arrays.sort(satisfaction);for (int i = 0, j = satisfaction.length - 1; i < j; i++, j--) {int temp = satisfaction[i];satisfaction[i] = satisfaction[j];satisfaction[j] = temp;}int presum = 0, ans = 0;for (int si : satisfaction) {if (presum + si > 0) {presum += si;ans += presum;} else {break;}}return ans;}
}

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

主要思想:二分查找,两个辅助函数,分别寻找左右区间,如果没找到返回-2,主函数分成三种情况,没找到返回-1,-1,如果rightRange-leftRange>1,也就是至少有一个,那么说明找到return leftRange+1,RightRange-1,其他情况,return -1,-1;

class Solution {public int[] searchRange(int[] nums, int target) {int left = searchLeftRange(nums, target);int right = searchRightRange(nums, target);if (left == -2 || right == -2) {return new int[]{-1, -1};}if (right - left > 1) {return new int[]{left + 1, right - 1};}return new int[]{-1,-1};}public int searchLeftRange(int[] nums, int target) {int left = 0;int right = nums.length-1;int leftRange = -2;while(left<=right){int mid = (left+right)>>1;if(nums[mid]<target){left = mid+1;}else{right = mid-1;leftRange = right;}}return leftRange;}public int searchRightRange(int[] nums, int target) {int left = 0;int right = nums.length-1;int rightRange = -2;while(left<=right){int mid = (left+right)>>1;if(nums[mid]>target){right = mid-1;}else{left = mid+1;rightRange = left;}}return rightRange;}}

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

主要思想:利用二分查找,旋转后,每次去抛弃较大区间,nums[mid]>nums[right]抛弃左边,注意left<right是循环条件,right = mid,

class Solution {public int findMin(int[] nums) {int left=  0;int right = nums.length-1;while(left<right){int mid = (left+right)>>1;if(nums[mid]>nums[right]){left = mid+1;}else{right = mid;}}return nums[left];}
}

一起加油!算法需要正向反馈,建议从专项练起,很多算法的数据结构,解题思路都需要接触,思维开拓了,就可以一题多解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293623.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm+jsp理发店管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;理发店管理系统也不例外&#xff0c;但目前国内的市场仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0…

经纬恒润参建龙拱港项目荣获5G“绽放杯”全国赛一等奖

近日&#xff0c;第六届“绽放杯”5G应用征集大赛全国总决赛在上海落幕。济宁港航龙拱港联合经纬恒润、济宁移动、中兴通讯共同打造的“5G专网赋能江北内河最大的集装箱示范港建设”项目&#xff0c;从全国4万多个优秀项目案例中脱颖而出&#xff0c;荣获全国赛区一等奖&#x…

算法通关村-番外篇排序算法

大家好我是苏麟 , 今天带来番外篇 . 冒泡排序 BubbleSort 最基本的排序算法&#xff0c;最常用的排序算法 . 我们以关键字序列{26,53,48,11,13,48,32,15}看一下排序过程: 代码如下 : (基础版) class Solution {public int[] sortArray(int[] nums) {for(int i 0;i < n…

医院手术麻醉系统源码,基于PHP、 js 、mysql、laravel、vue2技术开发,实现患者数据的自动采集和医疗文书自动生成

手麻系统作为医院信息化系统的一环&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程&#xff0c;可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

【计算机系统结构实验】实验4 向量扩展指令和编程

4.1 实验目的 理解向量的处理方法&#xff1b;掌握X86体系中MMX/SSE/AVX指令集进行编程的基本方法。理解SIMD指令含义及原理&#xff0c;了解Kunpeng数学库的安装与使用 4.2 实验平台 需要x86计算机和微软编程工具Visual Studio 2012。Taishan服务器&#xff0c;安装openEul…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近&#xff0c;我在使用电脑时遇到了一个问题&#xff0c;即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件&#xff0c;它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…

PostgreSQL从入门到精通教程 - 第39讲:数据库完全恢复

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第39讲&#…

JavaScript高级 构造函数与原型篇

构造函数与原型 1、构造函数 构造函数是一种特殊的函数&#xff0c;主要用来初始化对象&#xff0c;即为对象成员变量赋初始值&#xff0c;它总与new一起使用。我们可以把对象中一些公共的属性和方法抽取出来&#xff0c;然后封装到这个函数里面。 // 定义学生构造函数func…

微信小程序开发系列-02注册小程序

上一篇文章&#xff0c;创建了一个最小的小程序&#xff0c;但是&#xff0c;还有3个疑问没有弄清楚&#xff0c;还是基于demo1工程&#xff0c;这篇文章继续探索。 当前的目录结构是否是完备的呢&#xff1f;&#xff08;虽然小程序可以运行起来&#xff09;app.js文件内容还…

Springboot是什么?Springboot详解!入门介绍

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

使用通道和模式

通过通道、选择语句和最佳实践掌握 Go 中的并发编程 并发编程是构建高效和响应迅速的软件的强大范例。Go&#xff0c;也被称为 Golang&#xff0c;通过通道提供了一种健壮且优雅的解决方案来进行并发通信。在这篇文章中&#xff0c;我们将探讨通道的概念、它们在并发编程中的作…

海量搜索需求助推,跟着官方和优秀创作者一起来“百度夜校”开课!

文章目录 &#x1f354;概述&#x1f6f8;新中产消费人群占比高&#xff0c;教育博主快速崭露头角&#x1f6f8;亿级消费入口&#xff0c;泛知识创作者的新蓝海 &#x1f354;概述 近日&#xff0c;百度百家号官方开启“教育变现专场”和“泛知识专场”两场爆款公开课的讲座&a…