【ソードオファー】11回転アレイの最小数

一つ、問題

1.配列の最初の要素を配列の最後に移動します。これを配列の回転と呼びます。昇順配列の回転を入力し、回転した配列の最小要素を出力します。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]の回転であり、配列の最小値は1です。

2.例

入力:[3,4,5,1,2]
出力:1

入力:[2,2,2,0,1]
出力:0

二、解決策

1.暴力法

添え字0の要素からトラバースを開始します

比較ごとに、現在の要素が次の隣接する要素よりも大きい場合、対応する次の要素が最小値になります

クエリの最後の要素に2がない場合、添え字要素が最小の要素です。

2.二分法

要素を順番に保存する(必須)

package com.haoxiansheng.demo01.SwordfingerOffer;

import lombok.extern.slf4j.Slf4j;

import java.util.Vector;

/**
 * @author flame
 * @data 2020/10/24
 */
@Slf4j
public class MinArrayDemo {
    
    
    public static void main(String[] args) {
    
    
        int [] arr = {
    
    2, 3, 4, 5, 0, 1};
        log.info("minArray=>{}", minArray(arr));
    }

    // 暴力匹配  + 二分查找
    // 时间复杂度为 O(n)
    // 空间复杂度:O(1)
    public static int minArray(int [] numbers) {
    
    
        int left = 0;
        int right = numbers.length -1;

        if (right == 0) {
    
    
            return numbers[0];
        }

        while (left < right) {
    
    
            int mid = left + (right - left) / 2;
            if (numbers[mid] > numbers[right]) {
    
    
                left = mid + 1;
            } else if(numbers[mid] < numbers[right]) {
    
    
                right = mid;
            } else if (numbers[mid] == numbers[right]) {
    
    
                right --; // 暴力缩减范围
            }
        }
        return numbers[left];
    }
}

おすすめ

転載: blog.csdn.net/qq_40996741/article/details/109268287