题目:
1、暴力解法
1 package com.example.demo; 2 3 public class TestLeetCode { 4 public static void main(String[] args) { 5 TestLeetCode t = new TestLeetCode(); 6 int[] i = {2, 7, 11, 15}; 7 int target = 17; 8 int[] o = t.twoSum(i, target); 9 10 for (int i1 : o) { 11 System.out.println(i1); 12 } 13 14 } 15 16 /** 17 * 暴力解法就是将所有的数据都算一遍,和目标值比较,同泽返回i,j索引,否则返回null即可(遍历冒泡) 题目要求返回的是索引数据,并不是值数组 18 * @param nums 19 * @param target 20 * @return 21 */ 22 public int[] twoSum(int[] nums, int target) { 23 24 for (int i = 0; i < nums.length; i++) { 25 //j = i + 1 ,不和自身相加 26 for (int j = i + 1; j < nums.length; j++) { 27 if ((nums[j] + nums[i]) == target) { 28 return new int[]{i, j}; 29 } 30 } 31 } 32 return null; 33 } 34 }
2、使用map数据结构
package com.example.demo; import java.util.HashMap; import java.util.Map; public class TestLeetCode { public static void main(String[] args) { TestLeetCode t = new TestLeetCode(); int[] i = {2, 7, 11, 15}; int target = 17; int[] o = t.twoSum(i, target); for (int i1 : o) { System.out.println(i1); } } /** * 利用hash数据结构,先将数组中的value作map的key,index作map的value,保存起来,然后遍历数组, * 如果存在一个结果等于target-nums[i]时,此时这个值和nums[i]就是目标值,再通过map.get()来获取到对应的索引 * * @param nums * @param target * @return */ public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int i = 0; i < nums.length; i++) { int index_value = target - nums[i]; if (map.containsKey(index_value) && nums[i] != index_value) { return new int[]{i, map.get(index_value)}; } } return null; } }
修改:
package com.example.demo; import java.util.HashMap; import java.util.Map; public class TestLeetCode { public static void main(String[] args) { TestLeetCode t = new TestLeetCode(); int[] i = {2, 7, 11, 15}; int target = 17; int[] o = t.twoSum(i, target); for (int i1 : o) { System.out.println(i1); } } /** * 利用hash数据结构,一次遍历,在遍历的时候判断是否存在,不存在则将当前的值放到map里,以便之后调用 * * @param nums * @param target * @return */ public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int index_value = target - nums[i]; if (map.containsKey(index_value) && nums[i] != index_value) { //这块换了位置,是因为map里边放的都是比当前索引小的值 return new int[]{map.get(index_value), i}; } map.put(nums[i], i); } return null; } }
参考:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/