我正在嘗試解決有關 Leetcode 的問題
查找大于目標的最小字母
給定一個按非降序排序的字符陣列 letters 和一個字符目標,回傳陣列中大于目標的最小字符。
請注意,字母環繞。
例如,如果
target == 'z'和letters == ['a', 'b'],答案是“a”。Example 1: Input: letters = ["c","f","j"], target = "a" Output: "c" Example 2: Input: letters = ["c","f","j"], target = "c" Output: "f" Example 3: Input: letters = ["c","f","j"], target = "d" Output: "f"約束:
2 <= letters.length <= 104 letters[i] is a lowercase English letter. letters is sorted in non-decreasing order. letters contains at least two different characters. target is a lowercase English letter.
到目前為止,我的解決方案看起來像這樣:
function nextGreatestAlphabet(letters, target){
let left = 0;
let right = letters.length - 1;
let res = -1;
while(left <= right) {
let mid = Math.floor(left (right - left) / 2);
if (letters[mid] == target ) { console.log(1)
res = letters[mid];
left = mid 1;
}
if(letters[mid] > target){ console.log(2)
right = mid -1;
res = letters[mid];
}
if(letters[mid] < target ){ console.log(3)
left = mid 1;
}
}
return res;
}
console.log(nextGreatestAlphabet(["c","f","j"],"c")); //c
但正確的結果應該是“f”,因為這里已經存在 c,下一個最大的是 f
uj5u.com熱心網友回復:
你應該避免res在搜索程序中設定,當然不要在 時設定letters[mid] == target,因為它肯定不是正確的答案。相反,您應該在回圈退出后得到結果。
這也意味著您不需要單獨的案例 for letters[mid] == target,因為其余的操作正是為 . 所做的letters[mid] < target。所以你可以把它做成一個非常簡單的if (letters[mid] > target) ... else ...結構。
回圈退出后,left索引指向所需的字符。然后,您需要處理該索引指向陣列之外并將其映射到 0 的邊界情況。您可以使用余數運算子來執行此操作:
注意:我在這里使用 LeetCode 挑戰所要求的函式名稱:
function nextGreatestLetter(letters, target) {
let left = 0;
let right = letters.length - 1;
while(left <= right) {
let mid = Math.floor(left (right - left) / 2);
if(letters[mid] > target) {
right = mid -1;
} else {
left = mid 1;
}
}
return letters[left % letters.length];
}
就個人而言,我更喜歡在正在考慮的范圍之后right作為索引,并且為了推導您可以使用運算子(陣列大小在這個挑戰中受到限制,因此這是一個安全的操作):mid>>
function nextGreatestLetter(letters, target) {
let left = 0;
let right = letters.length;
while (left < right) {
let mid = (left right) >> 1;
if (letters[mid] > target) {
right = mid;
} else {
left = mid 1;
}
}
return letters[left % letters.length];
}
uj5u.com熱心網友回復:
我認為你的
if (letters[mid] == target ) { console.log(1)
res = letters[mid];
left = mid 1;
}
將結果設定為目標,但您實際上想要下一個,所以它應該是 sth。喜歡
res=letter[mid 1].
如果
mid==letters.length - 1
成立那么它已經是正確的結束。那么你可以把
res = letter[0];
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505864.html
標籤:javascript 算法 二分搜索
上一篇:JavaScript-如何計算物件陣列中最大值的距離
下一篇:涉及求和值的串列理解
