[LeetCode 34]PHPは配列の中で元素の第1と最後の位置を探すことを求めます
原文リンク:のブログ
ソート配列で要素の最初の位置と最後の位置を検索
昇順に配列された整数配列
配列にターゲット値
ステップ:時間複雑度
例1:
例2:
例3:
ヒント: 0 <= nums.length <= 105 -109 <= nums[i] <= 109 numsは非減算配列 である -109 <= target <= 109
出典:LeetCode(LeetCode)リンク:https://leetcode-cn.com/probl...著作権はバックルネットワークの所有に帰属する.商業転載は公式の授権に連絡し、非商業転載は出典を明記してください.
問題を解く考え方1
暴力捜査と特殊な結果の処理
問題を解く考え方2
二分法の考え方を利用して、まず二分法を利用して
参照リンク: 極客時間アルゴリズム面接通関40講
最後のチャペル阿里雲全シリーズ製品/メールパック特恵中小企業上雲ベスト選択阿里雲内部クーポン購入
ソート配列で要素の最初の位置と最後の位置を検索
昇順に配列された整数配列
nums
と、目標値target
が与えられる.配列内の所定のターゲット値の開始位置と終了位置を特定します.配列にターゲット値
target
が存在しない場合は、[-1, -1]
を返します.ステップ:
O(log n)
のアルゴリズムを設計して実現できますか?例1:
:nums = [5,7,7,8,8,10], target = 8
:[3,4]
例2:
:nums = [5,7,7,8,8,10], target = 6
:[-1,-1]
例3:
:nums = [], target = 0
:[-1,-1]
ヒント:
出典:LeetCode(LeetCode)リンク:https://leetcode-cn.com/probl...著作権はバックルネットワークの所有に帰属する.商業転載は公式の授権に連絡し、非商業転載は出典を明記してください.
問題を解く考え方1
暴力捜査と特殊な結果の処理
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function searchRange($nums, $target) {
//
$result = [-1, -1];
if (empty($nums)) {
return $result;
}
// + $result
$i = 0;
foreach ($nums as $key => $num) {
if ($num == $target) {
if ($i == 0) {
$result[0] = $key;
} else {
$result[1] = $key;
}
$i++;
}
}
//
if ($result[0] !== -1 && $result[1] == -1) {
return [$result[0], $result[0]];
}
return $result;
}
}
問題を解く考え方2
二分法の考え方を利用して、まず二分法を利用して
target
に合致する値を見つけて、更にそれぞれ二分法でtarget
の開始の位置と終了の位置を求めます.class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function searchRange($nums, $target) {
$result = [-1, -1];
if (empty($nums)) {
return $result;
}
$left = 0;
$count = count($nums);
$right = $count - 1;
while ($left <= $right) {
$mid = round($left + ($right - $left) / 2);
if ($nums[$mid] == $target) {
$left = $mid;
$right = $mid;
// $nums[$left - 1] == $nums[$left],
while ($left > 0 && $nums[$left - 1] === $nums[$left]) {
--$left;
}
// $nums[$right + 1] == $nums[$right],
while ($right < $count - 1 && $nums[$right] === $nums[$right + 1]) {
++$right;
}
$result[0] = $left;
$result[1] = $right;
break;
} else if ($nums[$mid] > $target) {
$right = $mid - 1;
} else {
$left = $mid + 1;
}
}
return $result;
}
}
参照リンク:
最後のチャペル阿里雲全シリーズ製品/メールパック特恵中小企業上雲ベスト選択阿里雲内部クーポン購入