【Java】牛客_剣指offer(JZ 6)回転配列の最小数値
5928 ワード
テーマの出所:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&&tqId=11159&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
タイトルの説明
1つの配列の最初のいくつかの要素を配列の末尾に運び、配列の回転と呼ぶ.非減算ソート配列の回転を入力し、回転配列の最小要素を出力します.例えば、配列{3,4,5,1,2}は{1,2,3,4,5}の回転であり、この配列の最小値は1である.NOTE:与えられたすべての要素は0より大きく、配列サイズが0の場合は0を返します.
問題解
問題解決の考え方:まず、これは間違いなく問題を探して、直接暴力的に並べ替えて最小値を見つけることができますが、出題の意思に合わないに違いありません. は、回転配列の元の配列が非減算ソートであるため、元の配列は昇順であり、数字は繰り返すことができる. したがって、配列の開始部分を配列の末尾に運ぶと、配列左部分>配列右部分、すなわち最小値が右部分の最初の数 であることがわかる.配列は秩序と見なすことができるため、二分で検索することができるが、目標値targetがない、すなわち最小値を決定していないことがこの問題の難点であるため、ここではtargetと中間値を比較するのではなく、中間値と最右値を比較する である. であることを避けることに注意する. . 左にシフトする.最後に、 である.
コード実装
タイトルの説明
1つの配列の最初のいくつかの要素を配列の末尾に運び、配列の回転と呼ぶ.非減算ソート配列の回転を入力し、回転配列の最小要素を出力します.例えば、配列{3,4,5,1,2}は{1,2,3,4,5}の回転であり、この配列の最小値は1である.NOTE:与えられたすべての要素は0より大きく、配列サイズが0の場合は0を返します.
問題解
問題解決の考え方:
array[mid] < array[high]
の場合、中間値array[mid]
が右部分にあることは分かるが、mid
は必ずしも最小とは限らないので、high
は左に移動し、high = mid
はhigh
ではなく、mid-1
がちょうど最小値mid
の場合、中間値array[mid] > array[high]
が左部分にあることが分かるので、array[mid]
は右に移動し、low
low = mid + 1
が重複する数字に遭遇すると、array[mid] = array[high]
は1ビットhigh
の場合、最小値コード実装
/**
*
*/
public class Solution {
public int minNumberInRotateArray(int[] array) {
//
if (array == null || array.length == 0) {
return 0;
}
int low = 0;
int high = array.length - 1;
// ,low = high , low = high
while (low < high) {
// mid mid=(low+high)/2, oj
int mid = low + (high - low) / 2;
// array[mid] < array[high],array[mid] , high
if (array[mid] < array[high]) {
// , high=mid-1, mid
high = mid;
}
// array[mid] > array[high],array[mid] , low
else if (array[mid] > array[high]) {
low = mid + 1;
}
// array[mid] = array[high] ,high
else {
high -= 1;
}
}
return array[low];
}
}