二分的主要細節在於左右區間的選擇。 如leetcode704.
原題鏈結
var search = function(nums, target) else;
};return -1;
};
主要的要點在於要清楚查詢的區間。這裡是乙個前閉合後閉合。
除了基本的排序不重複陣列中查詢值,還有一種在排序重複陣列中查詢值的左右邊界。
如[1,2,3,3,3,3,4,5]陣列,給定值3,求查詢出該陣列中第一次出現3這個值的位置。該種查詢叫做左側邊界查詢。這種做法可以選擇二分,也可以選擇遍歷。遍歷的時間複雜度過高,要o(n)。
var search = function(nums,target)else if(nums[mid] < target)else if(nums[mid] > target);
}return left;
}
同樣是採用左閉右開,別的地方都容易推理,主要是返回值與之前不同。因為是左閉右開區間,並且整體是左區間在收縮,因此要找的值會在left和right的左側,因此要減1.
var right_bound = function(nums, target) else if(nums[mid] < target)else if(nums[mid] > target)
};return left - 1;//返回右邊界
}
leetcode的原題:搜尋旋轉排序陣列
本質上仍然是基礎的二分查詢,只是旋轉陣列中,存在乙個大段和小段的問題,,因此多了一步中點值位於哪一塊的問題。
var search = function(nums, target) else
}else if(nums[start] > nums[mid])else }}
return -1;
};
leetcode的原題: 搜尋旋轉排序陣列ii
本題是上一題的變種,多了乙個重複數字,因此在判斷大小段的時候,不能使用<= 。對於==的情況要特殊另外處理。
var search = function(nums, target) else
}else if (nums[start] > nums[mid])else
}else if(nums[start] === nums[mid]);
};return false;
};
二分查詢總結
今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...
二分查詢總結
我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...
二分查詢總結
二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...