对于查找的题目,一般来说可以从暴力解法和二分查找这两个方法着手。
一、在升序的数组中,找到一个目标值
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
解法一:暴力解法
int search(vector<int>& nums, int target) {
// write code here
// 暴力解法
for(int i=0;i<nums.size();i++)
{
if(nums[i] == target)
return i;
}
return -1;
}
解法二:
int search(vector<int>& nums, int target) {
// write code here
int l= 0;
int r = nums.size()-1;
if(!nums.size())
{
return -1;
}
while(l<=r)
{
int mid = l + (r - l)/2;
if(nums[mid] < target)
{
l = mid +1;
}
else if(nums[mid] > target)
{
r = mid -1;
}
else
{
return mid;
}
}
return -1;
}
二、二维数组中的查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
// 暴力解法
for(int i = 0;i< array.size();i++)
for(int j = 0;j< array[i].size();j++)
{
if(array[i][j] == target)
{
return true;
}
}
return false;
}
};
解法二:二分查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
// 二分查找
for(int i=0;i<array.size();i++){
int low=0;
int high=array[i].size()-1;
while(low<=high){
int mid=(low+high)/2;
if(target>array[i][mid])
low=mid+1;
else if(target<array[i][mid])
high=mid-1;
else
return true;
}
}
return false;
}
};
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = array.size();
int cols = array.size();
int i = rows-1; // 左下角元素坐标
int j = 0;
if(!array.size())
return false;
if(!array[0].size())
return false;
while(i>=0 and array[i][j])
{
if(target < array[i][j])
{
i--; // 查找的元素较小,往上的第一个数字开始找
}
else if(target>array[i][j])
j++; // 查找的元素较大,往后找
else
return true; // 找到
}
return false;
}
};