🍜一道算法题
题目:
给一个数组nums和一个整数目标值target,请你在该数组中找出,和为目标值的那两个整数,并返回他的数组下标,你可以假设每种输入只会对应一个答案,但是,数组中同一个元素在答案里不能重复出现
- 2<=nums.length<=103
- -109<=nums[i]<=109
- -109<=target<=109
- 只会存在一个答案(时间和空间二者不可兼得)
解法一:暴力解法双循环(效率最低)
释:直接双重循环用一个数跟后面的每一个数进行求和比较即可
- ①首先在if(nums==null||nums.length==0)这里两个条件不能颠倒,不然输入空数组时,会报空指针异常。
- ②在if(nums==null||nums.length==0)之后不能用return null;不然在输出结果时,会报出空指针异常
- ③在if(nums==null||nums.length==0)这里不能使用异常抛出,一旦抛出异常,就会中断程序,导致无返回值,无答案(题目只会存在一个答案)
- ④时间复杂度:最差情况O(n^2) ; 空间复杂度:O(1)
- ⑤运行期异常会中断程序
- ⑥运行期异常(RuntimeException)无需用try…catch包含
- ⑦一旦出现,会终止程序 • 常见的有空指针异常,除0异常
//暴力解法
public class Test01 {
public static void main(String[] args) {
//int[] nums={1,2,3,41,5,6,71,8,9,0};
int[] nums={2,7,11,15};
//int[] nums=null;
int target=9;
int[] result=methods(nums,target);
System.out.println(Arrays.toString(result));
}
private static int[] methods(int[] nums, int target) {
int[] nullNum=new int[0];
if(nums==null||nums.length==0){
//此处不能用return null,不然返回输出时会报空指针异常
//此处一旦使用异常,则没有返回值,导致无结果
//return null;
return nullNum;
//throw new IllegalArgumentException("不能为空");
}
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j <nums.length ; j++) {
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return nullNum;
}
}
使用异常的结果:
正常结果一:int[] nums={1,2,3,41,5,6,71,8,9,0};, int target=0;
正常测试二:int[] nums={1,2,3,41,5,6,71,8,9,0};int target=9;
正常测试三:int[] nums=null;int target=9;
解法二:哈希表HashMap
- 时间复杂度O(n) ;空间复杂度O(n)
- 对HashMap具体理解以后补充
/哈希表解法
public class Test02 {
public static void main(String[] args) {
//int[] nums={1,2,3,41,5,6,71,8,9,0};
int[] nums={2,7,11,15};
//int[] nums=null;
int target=9;
int[] result=methods(nums,target);
System.out.println(Arrays.toString(result));
}
private static int[] methods(int[] nums, int target) {
int[] nullNum=new int[0];
if(nums==null||nums.length==0){
//此处不能用return null,不然返回输出时会报空指针异常
//此处一旦使用异常,则没有返回值,导致无结果
//return null;
return nullNum;
//throw new IllegalArgumentException("不能为空");
}
//主要改变的地方,用哈希表只需要一个表
HashMap<Integer,Integer> map=new HashMap<>();
for (int i = 0; i <nums.length ; i++) {
if(map.containsKey(target-nums[i])){
//通过containsKey判断是否有target-nums[i]==键值
//if为true直接返回满足条件的两个下标
return new int[]{i,map.get(target-nums[i])};
}
map.put(nums[i],i);
}
return nullNum;
}
}
结果:
-
空间复杂度:
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
-
时间复杂度:
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。