题目链接:https://leetcode-cn.com/problems/two-sum/
1、暴力法:
双重循环。复杂度O(n)。
class Solution {
public int[] twoSum(int[] nums, int target) {
int a[]=new int[2];
for(int i=0;i<nums.length;i++)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]+nums[j]==target)
{
a[0]=i;
a[1]=j;
return a;
}
}
}
return a;
}
}
2、哈希表对全部元素记录并标记下标,一重循环即可。时间复杂度O(N)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=1;i<nums.length;i++)
{
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++)
{
int res=target-nums[i];
if(map.containsKey(res) && map.get(res)!=i)
{
return new int[]{i,map.get(res)};
}
}
return new int[]{};
}
}
3、依然采用哈希表,第二种策略的升级版
略快,平均时间复杂度依然O(N)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++)
{
int res=target-nums[i];
if(map.containsKey(res) && map.get(res)!=i)
{
return new int[]{i,map.get(res)};
}
map.put(nums[i],i);
}
return new int[]{};
}
}