每日算法(十三)-java从一个有序数组中找出目标元素在数组中的出现的首次和最后一次位置
2019-05-07 20:06
113 查看
每日算法(十三)-java从一个有序数组中找出目标元素在数组中的出现的首次和最后一次位置
从一个有序数组中找出目标元素在数组中的出现的首次和最后一次位置
要求时间复杂度O(logn)
Example 1:
Input: nums = [5,7,7,8,8,8,10], target = 8
Output: [3,5]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
这里因为是有序数组所以可以采用二分法来解决,分别找出第一次出现的位置和最后一次出现的位置
选出中间位置开始往两边走,不断的去找与目标元素相同的数的位置,如果没有则返回-1,有则返回位置下标
需要注意的是在找最后一次出现的时候,中间数的位置mid要+1,对应的边界也会发生相应变化,要不会越界
public static int searchfirst(int nums[],int target){ int left=0; int right=nums.length-1; int mid=0; while(left<=right){ mid=(right+left)/2; if(target>nums[mid]){ left=mid+1; }else{ right=mid; }if(right==left){ break; } } if(nums[left]!=target){ return -1; }else{ return left; } } public static int searchlast(int nums[],int target ){ int left=0; int right=nums.length-1; int mid=0; while(left<=right){ mid=((left+right)/2)+1; if(target>=nums[mid]){ left=mid; }else{ right=mid-1; }if(right==left){ break; } } if(nums[right]!=target){ return -1; }else{ return right; } }
相关文章推荐
- java常用算法之返回目标数字在有序数组中的位置(假设有序数组中不存在重复数字)
- 每日算法(二十一)-java给定一个数组,求是否存在数组里的两个元素相加等于目标数并求出下标(三种方法)
- 每日算法(十六)-java给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数,输出旋转后的数组
- 每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- JAVA代码—算法基础:找出整形数组中只出现过1次的两个元素
- 每日算法(十五)-java给定一个有序数组,删除其中重复元素,只保留一个,并返回新数组的长度
- 算法:数组找出2个只出现一次的数字(其他元素出现两次)
- 查找有序数组中某个数首次出现的位置
- 找出有序元素数组中指定元素出现的次数
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
- 在有序的数组中获取目标值的地址——二分查询算法(java实现)
- lastIndexOf() 找出指定元素出现的所有位置(返回的是下标数组)---lastIndexOf() 这个方法是倒叙查找,正序的是indexOf()
- java版的小明的筷子,主要是找出数组中只出现一次的元素
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 算法之找出数组中出现次数大于n/m的元素
- java 找出n个元素数组中重复次数最多的数(假设出现次数大于n/2)
- 有序的数组中找到某一目标值首次出现的下标
- indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找