题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
示例:
输入:nums = [2,7,11,15], target = 9 输出:[0,1]
输入:nums = [3,2,4], target = 6 输出:[1,2]
题解代码:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i, j; for(i = 0; i < nums.size(); ++i) for(j = i + 1; j < nums.size(); ++j) if(nums[i] + nums[j] == target) return {i, j}; return {}; } }; //C++版本
int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int i, j; *returnSize = 2; int* result = (int*)malloc(sizeof(int)*2); for(i = 0; i < numsSize - 1; ++i) for(j = i + 1; j < numsSize; ++j) { if(nums[i] + nums[j] == target) { result[0] = i; result[1] = j; return result; } } return result; } //C版本
遇到的一些问题:
(C版本)
之前创建动态数组的时候用new习惯了,不太熟悉malloc的用法。
其实不太明白为什么函数的参数中要给出returnSize(但发现如果将*returnSize=2注释掉后,会出错)(看了一些博文,returnSize其实就是返回数组的元素个数,至于为什么要用指针,是为了传递一个地址,把调用这个函数的原函数的相应参数做修改...后续应该会有更深入的认识)。
(C++版本)-----主要想了解一下vector的用法
简单了解vector
1.1 vector说明
- vector是向量类型,可以容纳许多类型的数据,因此也被称为容器
- (可以理解为动态数组,是封装好了的类)
- 进行vector操作前应添加头文件 #include <vector>
1.2 vector初始化
方式1
1 //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值 2 3 vector<int>a(10);
方式2
1 //定义具有10个整型元素的向量,且给出的每个元素初值为1 2 3 vector<int>a(10, 1);
方式3
1 //用向量b给向量a赋值,a的值完全等价于b的值 2 3 vector<int>a(b);
方式4
1 //将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型 2 3 vector<int>a(b.begin(), b.begin()+3);
方式5
1 //从数组中获得初值 2 3 int b[7] = {1, 2, 3, 4, 5, 6, 7}; 4 vector<int>a(b, b+7);
1 /*这里觉得很奇怪 2 为什么是b.begin()+3而不是b.begin()+2?? 3 为什么是b+7而不是b+6*/ 4 5 //又查了一些博文,发现大家都是这么写的...或许以后会理解吧 6 7 int main() 8 { 9 int arr[] = {11, 32, 41, 25, 67, 100, 88, 233}; 10 vector<int> iv(arr+2, arr+7); 11 for(auto c : iv) //不会的知识点又增加了 12 cout << c << " "; 13 cout << endl; 14 15 return 0; 16 }
//执行结果是41 25 67 100 88
1.3 vector对象的常用内置函数使用
1 #include <vector> 2 vector<int> a, b; 3 4 //b为向量,将b的0-2个元素赋值给向量a 5 a.assign(b.begin(), b.begin()+3); 6 7 //a含有4个值为2的元素(会改变a的size,但capacity不会变) 8 a.assign(4, 2); 9 10 //返回a的最后一个元素 11 a.back(); 12 13 //返回a的第一个元素 14 a.front(); 15 16 //这里简单查了一下,back与end、front与begin的区别在于前者是引用,后者不是引用,但自己没有验证过 17 18 //返回a的第i个元素,当且仅当a存在 19 a[i] 20 21 //清空a中的元素 22 a.clear(); 23 24 //判断a是否为空,空则返回true,非空则返回false 25 a.empty(); 26 27 //删除a向量的最后一个元素 28 a.pop_back(); 29 30 //删除a中第一个(从第0个算起)到第二个元素,共两个 31 a.erase(a.begin()+1, a.begin()+3); 32 33 //在a的最后一个向量后插入一个元素,其值为5 34 a.push_back(5); 35 36 //在a的第一个元素(从第0个算起)位置插入数值5 37 a.insert(a.begin()+1, 5); 38 39 //在a的第一个元素(从第0个算起)位置插入3个数,其值都为5 40 a.insert(a.begin()+1, 3, 5); 41 42 //b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第五个元素,不包括b+6 43 a.insert(a.begin()+1, b+3, b+6); 44 45 //返回a中元素的个数 46 a.size(); 47 48 //返回a在内存中总共可以容纳的元素个数 49 a.capacity(); 50 51 //将a的现有元素个数调整至10个,多则删,少则补,其值随机 52 a.resize(10); 53 54 //将a的现有元素个数调整至10个,多则删,少则补,其值为2 55 a.resize(10, 2); 56 57 //将a的容量扩容至100 58 a.reserve(100); 59 60 //b为向量,将a中的元素和b中的元素整体交换 61 a.swap(b); 62 63 //b为向量,向量的比较操作还有!= > >= <= < 64 a==b
学会区分size和capacity,简单理解貌似可以为 一个是实际size,一个是总size
2.顺序访问vector的几种方式
2.1对向量a添加元素的几种方式
方式1 向向量a中添加元素
1 vector<int> a; 2 for(int i = 0; i < 10; ++i) 3 a.push_back(i);
方式2 从数组中选择元素向向量中添加
1 int a[6] = {1, 2, 3, 4, 5, 6}; 2 vector<int> b; 3 for(int i = 0; i <= 4; ++i) 4 b.push_back(a[i]);
方式3 从现有向量中选择元素向向量中添加
1 int a[6] = {1, 2, 3, 4, 5, 6}; 2 vector<int> b; 3 vector<int> c(a, a+4); 4 for(vector<int>::iterator it = c.begin(); it<c.end(); ++it) 5 b.push_back(*it);
方式4 从文件中读取元素向向量中添加
1 ifstream in("data.txt"); 2 vector<int> a; 3 for(int i; in >> i) 4 a.push_back(i);
常见错误赋值方式
1 vector<int> a; 2 for(int i = 0; i < 10; ++i) 3 a[i] = i; //下标只能用来获取已经存在的元素,有评论说,失效的原因是没有分配空间,写成vector<int> a(10);就可以了,自己没试过
2.2 从向量中读取元素
方式1 通过下标方式获取
1 int a[6] = {1, 2, 3, 4, 5, 6}; 2 vector<int> b(a, a+4); 3 for(int i = 0; i <= b.size()-1; ++i) 4 cout << b[i] << endl;
方式2 通过迭代器方式读取
1 int a[6] = {1, 2, 3, 4, 5, 6}; 2 vector<int> b(a, a+4); 3 for(vector<int>::iterator it = b.begin(); it != b.end(); it++) 4 cout << *it << endl;
3.几个常用的算法
1 #include <algorithm> 2 3 //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素从小到大排列
/*如果要是从大到小排列,可以通过重写排序比较函数实现,如:
定义排序比较函数 bool Comp(const int& a, const int& b){return a>b;}
调用时,sort(a.begin(), a.end(), Comp);
4 sort(a.begin(), a.end()); 5 6 //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1 7 reverse(a.begin(), a.end()); 8 9 //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 10 copy(a.begin(), a.end(), b.begin()+1); 11 12 //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置 13 find(a.begin(), a.end(), 10); 14 /*这里有一个自己琢磨出来的用法 15 int main() 16 { 17 int arr[] = { 11, 32, 41, 25, 67, 100, 88, 233 }; 18 vector<int> iv(10); 19 iv.assign(arr, arr + 3); 20 vector<int>::iterator m = find(iv.begin(), iv.end(), 32); 21 cout << m[0] << endl; 22 23 return 0; 24 } 25 输出结果为32,但这怎么知道它在向量中的位置呢? 26 不是很懂... 27 */
好累o(╥﹏╥)o
2022-02-13
浙公网安备 33010602011771号