1. 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:
简单粗暴的for循环,这里主要复习一下容器的用法。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0,j=0;
vector<int> result(2,0);
int length = nums.size();
// int length = s1 / s2;
for(i=0;i<length;i++)
{
for(j=i+1;j<length;j++)
{
if(nums[i]+nums[j]==target)
{
result[0]=i;
result[1]=j;
return result;
}
}
}
}
};
复习一下容器的用法:
复习笔记:
容器vector<int>的用法:
1.声明及初始化
vector<int> a; //声明一个int型向量a
vector<int> a(10); //声明一个初始大小为10的向量
vector<int> a(10, 1); //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a); //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5); //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值
2.添加元素vector<int> a;
a.push_back(1); //在尾部加入一个数据
a.push_back(2);
a.pop_back(); //删除最后一个数据
a.insert(a.begin(), 0); //在a.begin()之前加入0
a.erase(a.begin()); //将a.begin()的元素删除
a.erase(a.begin() + 1, a.end()); //将第二个元素以后的元素均删除
3.判断vector是否为空
vector<int> a;
if(a.empty()){
a.push_back(1);
}
4.遍历访问vectorvector<int> a;
//像数组一样以下标访问
for(int i = 0; i < a.size(); i++){
cout << a[i];
}
//以迭代器访问
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++){
cout<<*it<<" " ;
}
5.排序必须包含algorithm头文件
#include <algorithm>
vector<int> a;
sort(a.begin(), a.end());
6.以vector实现二维数组
7.vector的长度获取 nums.size()
8.数组的长度获取 sizeof(a)
9.数组的动态申请 int result = new int [num];
vector<vector<int>> a(10, vector<int>(5)); //创建一个10行5列的int型二维数组 相当于a[10][5];
更新方法:
方法二:两遍Hash表
public static int[] twoSum02(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for(int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if(map.containsKey(complement) && map.get(complement) != i) {
return new int[] {i, map.get(complement)};
}
}
throw new IllegalArgumentException("No two sum solution");
}
1、为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素,如果存在,我们需要
找出它的索引.保持数组中的每个元素与其索引相互对应的最好办法就是hHsh表
2、时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)O(1)
,所以时间复杂度为 O(n)O(n)。
3、空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 nn 个元素。
方法三:一遍Hash表:
public static int[] twoSum03(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
int complement = target - nums[i];
if(map.containsKey(complement)) {
return new int[] {map.get(complement), i};
}
}
throw new IllegalArgumentException("No two sum solution");
}