トピックは次のとおりです
配列の最初から最後までいくつかの要素を移動することを、配列の回転と呼びます。昇順で並べ替えられた配列の回転を入力し、回転された配列の最小要素を出力します。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]の回転であり、配列の最小値は1です。
例1:
入力:[3,4,5,1,2]
出力:1
例2:
入力:[2,2,2,0,1]
出力:0
独自のアルゴリズムとコード
(コードは正しく実行および送信できます)
具体的なアルゴリズムは次のとおりです。
- 最小値を初期化します
min=-1
; - 配列を介して、満たされると
numbers[i] > numbers[i+1]
、にnumbers[i+1]
割り当てられmin
、ループから外れます。 - 判定
min
初期値に等しいか否かを-1
アレイ満たすか否か、すなわち、numbers[i] > numbers[i+1]
条件と、 - の場合
min==-1
、2つの状況が考えられます。最小値が最初または最後であるため、2つの数値を比較します。- の場合
numbers[0] < numbers[numbers.length-1]
、min = numbers[0]
; - の場合
numbers[0] > numbers[numbers.length-1]
、min = numbers[numbers.length-1]
;
- の場合
public class Solution {
public static int minArray(int[] numbers) {
int min = -1;
for (int i = 0; i < numbers.length-1; i++){
if (numbers[i] > numbers[i+1]){
min = numbers[i+1];
break;
}
}
if (min == -1){
if (numbers[0] < numbers[numbers.length-1]){
min = numbers[0];
}else {
min = numbers[numbers.length-1];
}
}
return min;
}
public static void main(String[] args) {
int[] numbers = {
2,3,4,5,1};
int result = minArray(numbers);
System.out.println(result);
}
}
参照アルゴリズムとコード(二分探索法)
class Solution {
public int minArray(int[] numbers) {
int low = 0;
int high = numbers.length - 1;
while (low < high) {
int middle = low + (high - low) / 2;
if (numbers[middle] < numbers[high]) {
high = middle ;
} else if (numbers[middle] > numbers[high]) {
low = middle + 1;
} else {
high -= 1;
}
}
return numbers[low];
}
}