用于作者进行学习,本内容摘自代码随想录,感谢Carl!!!请大家可以去b站进行关注和学习。
1.基础介绍
数组是存放在连续内存空间上的相同的类型数据的集合。
在实际操作中,数组可以退通过下标索引,进而获取得到对应下标的存储数据。
这里提供一个string 字符串数组的例子,如下图所示:

注意:从上面图片可以看出有两个特点:
1,下标的索引是从0开始的;
2,数组的内存空间的地址是连续的。
通过上述的介绍,我们可以进一步得出:
在我们进行删除或者添加元素的操作时,就需要移动其他的元素的地址。原因就是数组的内存空间的地址是连续的。
在C++中,需要认识到vector和array的区别,vector的底层实现是array。严格来讲vector是容器,不是数组。
另外,需要注意的是:数组的元素是不能删除的,只能覆盖。
二维数组如图所示:

说要明确,不同编程语言的内存管理是不一样的,以C++为例,C++中二维数组是连续分布的。
下面展示一些 内联代码片。
test_arr(){
int array[2][3]={
{
0,1,2},
{
3,4,5}
};
cout<<&array[0][0]<<" " << &array[0][1] << " " << &array[0][2] << endl;
cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
}
int main(){
test_arr();
return 0;
}
输出结果为:
0x7ffee4065820 0x7ffee4065824 0x7ffee4065828
0x7ffee406582c 0x7ffee4065830 0x7ffee4065834

地址为16进制,可以看出C++中,二维数组的内存地址是连续的。
2.二分查找法
问题描述:
给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜素nums中的target,如果目标值存在返回下标,否则返回-1。
示例 1:
输⼊: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输⼊: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
思路:
二分法的前提:
1.数组为有序数组
2.数组中无重复元素
写二分法,区间定义有两种,分别是左闭右闭、左闭右开。
左闭右闭代码:
int searchIndex(const vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
int i, j;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid - 1;
}else if (nums[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
左闭右开代码:
#include <iostream>
#include <vector>
using namespace std;
int searchIndex(const vector<int>& nums, int target) {
int left = 0, right = nums.size(); //左闭右开
int i, j;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid;
}else if (nums[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
int main() {
int n, target;
cin >> n;
vector<int> nums(n);
for (int i = 0;i < n

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



