数据结构-在旋转过的有序数组中寻找目标值-java

题目

有一个长度为 n 的按严格升序排列的整数数组 nums ,在实行 search 函数之前,在某个下标 k 上进行旋转,使数组变为[nums[k],nums[k+1],…,nums[nums.length-1],nums[0],nums[1],…,nums[k-1]]。给定旋转后的数组 nums 和一个整型 target ,请你查找 target 是否存在于 nums 数组中并返回其下标(从0开始计数),如果不存在请返回-1。
比如,数组[0,2,4,6,8,10]在下标3处旋转之后变为[6,8,10,0,2,4], 当给定target为10时,10的下标是2,target为3时,nums数组中不存在3,所以返回-1

题解一

最简单的方法是循环数组,与target进行比较,相等返回下标,否则返回-1.

代码

    public int search (int[] nums, int target) {
    
    
        // write code here
        for(int i=0;i<nums.length;i++){
    
    
            if(nums[i]==target){
    
    
                return i;
            }
        }
        return -1
    }

题解二

用二分法

 public int search (int[] nums, int target) {
    
    
        // write code here
        int left = 0;//设置左指针为初始位置
        int right = nums.length - 1;//设置右指针为末尾位置
        while(left <= right){
    
    //循环条件
            int mid = left + (right - left) / 2;//中间值为
            if(nums[mid] == target){
    
    //判断中间值是否等于目标值
                return mid;
            }
            if(nums[mid] >= nums[left]){
    
    
                if(nums[mid] > target){
    
    
                    right = mid - 1;
                }
                else{
    
    
                    left = mid + 1;
                }
            }
            else{
    
    
                if(target > nums[mid] && target <= nums[right]){
    
    //目标值大于中间值且小于最右边的值
                    left = mid + 1;
                }
                else{
    
    
                    right = mid - 1;
                }
            }
        }
        return -1;
        
    }

猜你喜欢

转载自blog.csdn.net/qq_25064691/article/details/121409247
今日推荐