第一题两数之和()
这个题没有什么难度啊(标示的足够清楚了)
1暴力解法 加法
class Solution { public int[] twoSum(int[] nums, int target) { //外层循环 遍历数组nums for(int i = 0;i < nums.length;i++){ //定义一个整型变量自每一次的循环过程中记住数组元素中的值 int first = nums[i]; //内层循环 对nums[i]后面的数进行遍历 /**注意:这里不能从下标为0的数组进行遍历 *示例二 6 = 3 + 3 执行会返回两个为0的下标 */ for(int j = i+1;j < nums.length;j++){ int lastNum = nums[j]; //循环判断目标结果的值 是否等于target if(first + lastNum == target){ //记录元素的的下标 并且存储在数组中 int[] resArray = {i,j}; //得到数组后 直接return 并结束这个方法 return resArray; } } } return null; } }
暴力破解二 减法
class Solution { public int[] twoSum(int[] nums, int target) { for(int i = 0;i < nums.length;i++){ int first = nums[i]; //最后一个数字定义在了这里 代码更加简洁 int lastNum = target - first; for(int j = i+1;j < nums.length;j++){ if(lastNum == nums[j]){ int[] resArray = {i,j}; return resArray; } } } return null; } }
双列集合思路
代码优化 第三种思路双列集合HashMap(底层是数组 + 链表 + 红黑树)
这是hashmap的父类和实现的主要接口
1.hashmap中的键值对是封装在一个entry里面的 通过底层映射进行连接
这是haspmap里面的一个方法 传入的是一个键值对
class Solution { public int[] twoSum(int[] nums, int target) { //为了代码的简洁美观 new的时候泛型就不限制了 对象的类型可以省略 Map<Integer, Integer> hashmap = new HashMap<>(); for (int i = 0; i < nums.length; ++i) { if (hashmape.containsKey(target - nums[i])) { return new int[]{hashmap.get(target - nums[i]), i}; } hashmap.put(nums[i], i); } return new int[0]; } }
总结:
题目比较简单,毕竟暴力也可以解决,唯一的亮点就是从时间的复杂度变得稍微缓和了一点 ,对于集合
hash的使用会让人眼前一亮