标签:targe img ems 相等 for dex tco src 假设
给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
public class Solution {
public int[] twoSum(int[] nums, int target) {
// 定义一个数组接收返回的两个数组下标
int[] indexes = new int[2];
// 外层循环:所有数相加需要循环数组length-1次
// (例如:4个数需要经过第一次循环:1和2、3、4相加;第二次循环:2和3、4相加;第三次循环:3和4相加,共三次)
for (int i = 0; i < nums.length - 1; i++) {
// 定义内层循环依次相加的数组的下标(例如:第一次循环的2、3、4;第二次循环的3、4;第三次循环的4)
int k = i + 1;
// 内层循环:每次循环需要数组length-1-i次
// (例如:1和2、3、4相加循环3次;2和3、4相加循环2次;3和4相加循环1次)
for (int j = 0; j < nums.length - 1 - i; j++) {
// 依次通过相加检验是否与目标值相等,如果相等,分别将两数对应的当前变量存入事先定义好的数组中,确定为下标
if (nums[j] + nums[k] == target) {
indexes[0] = j;
indexes[1] = k;
}
k++;
}
}
return indexes;
}
}
于是我带着挫败又虚心的心态去查看学习了别人提交的代码以及官方答案,不得不说:简洁易于理解、思路清晰的解题方法与思路真是让我无比佩服,证明了我要学的还有太多了
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
当然这只是其中一种解决方法,官方还给出了:
方法二:两遍哈希表(包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n))
方法三:一遍哈希表(只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间)
以上两种方法皆降低了时间复杂度,提高了算法的效率,在这里就不详细列举了,大家可以在两数之和-题解中仔细研究。
标签:targe img ems 相等 for dex tco src 假设
原文地址:https://www.cnblogs.com/xiqingbo/p/arithmetic-01.html