第一题:两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
解:
class Solution {
public:
vector twoSum(vector& nums, int target) {//注意,返回的是vector
for(int i=0;i<nums.size()-1;i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
return {i,j};
}
}
}
return {0};
}
};
问题:
这道题使用的暴力解法,时间复杂度o(n^2),思路没有问题。主要是vector,当时学stl没有学好,做到这个题都不知道vector是什么……一直当成int 做的,一直出问题。百度了一下vector,这篇写的很好。
https://www.cnblogs.com/tvtaqa/p/6749025.html
简单地说,vector比数组更方便插入和删除,且不需要知道容量。
v.size()可求出容量。
总结:
求数组长度:
eg:int a[10];
sizeof(a) 就是数组所占用的字节数 也就是长度 在32位机器上是40
如果你要求的是当前数组中元素的个数,可以用
个数 = sizeof(a)/sizeof(int)
如果是 char a[10] 就是 sizeof(a)/sizeof(char)
求字符串长度:
strlen(str)、str.length()、str.size()、sizeof(str)都可以求字符串长度。
其中str.length()、str.size()、sizeof(str)是用于求string类对象的成员函数
strlen(str)是用于求字符数组的长度,其参数是char*。
改进:
class Solution {
public:
vector twoSum(vector& nums, int target) {
map<int,int> a;//建立hash表存放数组元素
vector b(2,-1);//存放结果
for(int i=0;i<nums.size();i++)
a.insert(map<int,int>::value_type(nums[i],i));//value_type:和前面数据类型一致
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))//map.count(Key)返回值为1或者0,1返回存在,0返回不存在,返回的是布尔类型的值,因为在map类型中所有的数据的Key值都是不同的,所以被count的数要么存在1次,要么不存在
//判断是否找到目标元素且目标元素不能是本身
{
b[0]=i;
b[1]=a[target-nums[i]];
break;
}
}
return b;
};
};
作者:gpe3DBjDS1
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-gpe3dbjds1/
来源:力扣(LeetCode)
map:对数据自动排序;红黑树