有人相爱,有人夜里看海,有人leetcode第一题做不出来
进入leetcode刷题算法阶段了,离学期结束不远了,写博客记录一下自己的成长,任务比较多。尽量坚持吧。
先上题目
Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order
C++ 解法1暴力
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
for(int i=0;i<n;i++)
{
if(i+1<n)
for(int k=i+1;k<n;k++)
{
if(nums[i]+nums[k]==target)
return {i,k};
}
}
return {};
}
};
不多说,直接二重循环嵌套暴力求解,最笨最直接的办法
leetcode给我们的预置代码中的这一行需要理解一下
vector<int> twoSum(vector<int>& nums, int target)
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。函数的返回值和参数中均有vector
因此我们直接利用nums.size返回对应数组长度
return{i,j}也是返回对应的vector的格式
C++解法二
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
unordered_map<int,int> hash;
for(int i=0;i<n;i++)
{
int var=target-nums[i];
if(hash.find(var)!=hash.end())
return {hash.find(var)->second,i};
hash[nums[i]]=i;
}
return {};
}
};
本来是直接用map的,结果意识到不是顺序map不通过,看了一下官方代码用的unordered_map。哈希表算法很好理解,优化的地方在于查找部分,自己写的话写个二分查找对数组和map键值对的效果其实差不多。注意这里给hash给值的时候不是顺序map,key值就是数组的数值,value才是对应的index
然后注意一下给hash表存值的时候要在find后面,这是避免当target的值是对应值两倍的特殊情况
Java 解法一 暴力
class Solution {
public int[] twoSum(int[] nums, int target) {
int n=nums.length;
for(int i=0;i<n;i++)
{
for(int k=i+1;k<n;k++)
{
if(nums[i]+nums[k]==target)
{
return new int[]{i,k};
}
}
}
return new int[0];
}
}
Java怎么可以这么快
Java解法二
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> hash =new HashMap<Integer, Integer>();
int n=nums.length;
for(int i=0;i<n;i++)
{
int var=target-nums[i];
if(hash.containsKey(var))
return new int[] {hash.get(var),i};
hash.put(nums[i],i);
}
return new int[0];
}
}