给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
1. 暴力法
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = 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){
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
}
算法复杂度分析:
时间复杂度=O(n^2)
空间复杂度=O(1)
空间复杂度如何算:
空间复杂度嘛,其实就是算法在运行过程中临时占用存储空间的大小。计算起来也不难,通常,我们都是看算法的最坏情况需要多少额外空间。
举个例子吧,如果你有一个简单的数组排序算法,比如冒泡排序,那么它的空间复杂度就是O(1)。因为不管数组多大,你只需要一个额外的变量来交换数组中的元素位置,所以空间需求是常数级别的。
但是,如果你使用了像归并排序这样的算法,那么空间复杂度就是O(n),因为在归并的过程中,你需要一个额外的数组来存储合并后的结果。
空间复杂度的计算主要是看算法在运行过程中除了存储输入数据之外,还需要多少额外的空间。这样,你就能更好地了解算法的性能,并优化它啦!
2.两遍哈希表
先把数组元素和对应下标存储在哈希表hashtable中,再通过一个循环,在表中寻找有没有元素满足要求的,如果有,检查它的下标,要求不能是同一个下标的元素,满足条件就通过hashtable返回它对应下标。
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> mapTable = new HashMap<>();
for(int i=0;i<nums.length;i++){
mapTable.put(nums[i], i);
}
for(int i=0;i<nums.length;i++){
int complement = target - nums[i];
if(mapTable.containsKey(complement) && mapTable.get(complement) != i){
return new int[]{i, mapTable.get(complement)};
}
}
return new int[]{0,0};
}
}
时间复杂度:O(n)
空间复杂度:O(n)
3.一遍哈希表
先判断hashtable中有没有满足要求的,再向hashtable插入元素和其对应下标。(插入之前判断,不会发生下标相同的元素相加等于target的情况)
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> mapTable = new HashMap<>();
for(int i=0;i<nums.length;i++){
int complement = target - nums[i];
if(mapTable.containsKey(complement)){
return new int[]{i, mapTable.get(complement)};
}
mapTable.put(nums[i], i);
}
return new int[]{0,0};
}
}
时间复杂度:O(n)
空间复杂度:O(n)
参考:【LeetCode】给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。_给定一个整数数组nums和一个目标值-CSDN博客

6699




被折叠的 条评论
为什么被折叠?



