力扣704. 二分查找
https://leetcode-cn.com/problems/binary-search/
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:有序,就是顺序查找,最简便的是二分查找
我的VS代码:
#include "stdafx.h"
#include<vector>
using namespace std;
class Solution {
public:
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
int binarySearch(vector<int> &nums, int target) {
// write your code here
//有序数组,二分查找
//二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)
if (nums.size()==0)
{
return -1;
}
int low = 0;
int high = nums.size()-1;
int mid = 0;
while (low <= high)
{
mid = low+(high-low) / 2;
if (target == nums[mid])
{
return mid;
}
else if(target > nums[mid])
{
low = mid+1;
}
else
{
high = mid-1;
}
}
return -1;
}
};
int main()
{
Solution s;
vector<int>nums;
nums.push_back(1); nums.push_back(2); nums.push_back(3); nums.push_back(3);
nums.push_back(4); nums.push_back(5); nums.push_back(10);
auto result=s.binarySearch(nums,3);
return 0;
}
力扣参考答案:
方法:二分查找
二分查找是一种基于比较目标值和数组中间元素的教科书式算法。
如果目标值等于中间元素,则找到目标值。
如果目标值较小,继续在左侧搜索。
如果目标值较大,则继续在右侧搜索。
算法:
初始化指针 left = 0, right = n - 1。
当 left <= right:
比较中间元素 nums[pivot] 和目标值 target 。
如果 target = nums[pivot],返回 pivot。
如果 target < nums[pivot],则在左侧继续搜索 right = pivot - 1。
如果 target > nums[pivot],则在右侧继续搜索 left = pivot + 1。
class Solution {
public:
int search(vector<int>& nums, int target) {
int pivot, left = 0, right = nums.size() - 1;
while (left <= right) {
pivot = left + (right - left) / 2;
if (nums[pivot] == target) return pivot;
if (target < nums[pivot]) right = pivot - 1;
else left = pivot + 1;
}
return -1;
}
};
作者:LeetCode
链接:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:LeetCode
链接:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。