前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法练习(19) - 查找循环有序数组任一数值的位置

算法练习(19) - 查找循环有序数组任一数值的位置

作者头像
惊羽-布壳儿
发布2022-06-15 16:10:08
3890
发布2022-06-15 16:10:08
举报
文章被收录于专栏:惊羽-布壳儿

题目

一个循环有序数组(如:3,4,5,6,8,9,11,0,1,2),要查找任一数值的位置。要求算法时间复杂度为log2(n)。 输入:数组 和 待查找元素 输出:返回数组元素下标,如果不存在返回-1 循环有序数组即原本有序数组折断后产生的,可认为数组原本排序是递增的,且不包含重复元素。

答案

代码语言:javascript
复制
import java.util.*;
public class Main {
    public static void main(String[] args) {
        
        int[] arr = {3,4,5,6,8,9,11,0,1,2};
        int left = 0;
        int right = arr.length -1;
        int target = 11;
        
        int index = getNumberIndex(arr ,left,right,target);
        System.out.print(index);
    }
    
    public static int getNumberIndex(int[] arr ,int left,int right,int target) {
        if(left == right){
            if(arr[left] == target){
                return left;
            }else {
               return -1; 
            }
        }
        int middle =  (left + right) / 2;
        int respre = getNumberIndex(arr,left,middle,target);
        int ressuf =  getNumberIndex(arr,middle + 1,right,target);
        return respre == -1 ? ressuf : respre;
    }
}

思路

递归 + 二分 + 分治;

分 :

分到最后一定是聚焦到单个值,也就是说每个元素都会被访问一遍;

聚合 :

对二分后的数组没有聚合的需求,只需要吧结果聚合一下就行 return respre == -1 ? ressuf : respre; 这一行意思是, 在递归返回的时候,结果一定是从单值传递上来的,所以,我们为了保证正确结果能够传递到最外层递归,使用三目来让 != -1 的值传递到最外层;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 答案
  • 思路
    • 分 :
      • 聚合 :
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档