2016-11-02 12 views
2

回転した配列があり、log n時間にその最小要素を見つける必要があります。私はいくつかのソリューションにhereを発見し、それらのいずれかを理解することはできません:私は、次の3つのオプションを参照してください回転した配列で分を求めます。実装を理解する

public int findMin(int[] nums) { 
    if(nums==null || nums.length==0) 
     return -1; 

    int i=0; 
    int j=nums.length-1; 

    while(i<=j){ 
     // Sorted (sub)array. We just return its first element. 
     if(nums[i]<=nums[j]) 
      return nums[i]; 

     int m=(i+j)/2; 

     if(nums[m]>=nums[i]){ 
      i=m+1; // The pivot is in the right subarray. So we go right 
     }else{ 
      j=m; // m is the index of the pivot. Why don't we just return it? 
     } 
    } 

    return -1; 
} 

:(サブ)配列をソートする

  • を。最初の要素を返します。
  • ピボットは右側のサブアレイにあります。だから我々は正しく行く。
  • mはピボットのインデックスです。だから私たちはそれを返さないのですか?
+0

「ピボット」とはどういう意味ですか、なぜあなたは「m」がそのインデックスだと思いますか? – user2357112

+0

ピボットは、アレイが回転する要素です。ピボットは 'm'または' m'の右側の要素であるため、 'm'はピボットのインデックスです。 –

+0

なぜそれは左にできないのですか? – user2357112

答えて

1

nums[m]が記載されている場合は必ずしも最小要素である必要はありません。例えば

、アレイは、我々が持っている最初の反復の間に、[6, 7, 1, 2, 3, 4, 5]の場合:

i = 0j = 6m = 3を。 nums[m] = 2、これはnums[i]未満ですが、明らかに最小ではありません。

+0

ありがとう、私はピボットが 'm'の左側にある場合を忘れてしまった –

関連する問題