目录
例2:leetcode 34.在排序数组中查找元素的第一个和最后一个位置
知识点:
- 数组是存放在连续内存空间上的相同类型数据的集合。
- 数组下标是从0开始的;
- 数组内存空间的地址是连续的,删除元素或者增添元素时要移动其他元素的地址。
- 数组的元素不能删只能覆盖。
- vector 与array区别:vector底层实现是array,vector是容器,不是数组。
算法:
1、二分查找(循环不变量原则)
重点:根据查找区间的定义做边界处理。
二分查找的使用前提条件:有序数组且数组中无重复元素。
区间定义一般有两种:左闭右开,左闭右闭。
例1:leetcode 704二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
#include<iostream>
using namespace std;
#include<vector>
int search(vector<int>&nums, int target) {
int left = 0;
int right = nums.size() - 1;//定义target在[left,right]左闭右闭区间里
while (left <= right) {
int middle = left + (right - left) / 2;//防止溢出,==(right - left) / 2
if (nums[middle] < target) {
left = middle + 1;
}
else if (nums[middle] > target) {
right = middle - 1;
}
else {
return middle;
}
}
return -1;
}
int main() {
cout << "请输入数组的元素个数: ";
int n;
while (cin >> n) {
vector<int> nums(n);
for (int i = 0; i < n; i++) cin >> nums[i];
cout << "请输入目标值(整数): " ;
int target;
cin >> target;
if (search(nums, target) == -1) {
cout << "该数组中没有与目标值相等的元素。" << endl;
}
else {
cout << "该数组中与目标值相等的元素下标为: " ;
cout<<search(nums, target)<<endl;
}
}
system("pause");
return 0;
}