[编程题] lc:167. 两数之和 II - 输入有序数组
题目描述
![image-20200721115631557]([编程题] lc[剑指 Offer 14_ I剪绳子(动态规划).assets/image-20200721115631557.png)
输入输出例子
见上
思路
方法1、暴力匹配
时间复杂度O(n的2次方)
Java代码
class Solution {
public int cuttingRope(int n) {
//情况1:对于两种极端情况先讨论
if(n==1 || n==2){return 1;}
//情况2:对于n=3的时候,也是只能分成了2*1一种结果
if(n==3){return 2;}
//情况3:当n>3的时候,可分的情况就多了。如下
int a = n/3;
int b = n%3;
//3.1如果是b=0
if(b==0){
return (int)Math.pow(3,a);
}else if(b==1){
return (int)Math.pow(3,a-1)*2*2; //3.2如果是b=1,把最后一个3和1 分为2*2的结果
}else{
return (int)Math.pow(3,a)*2; //如果余数b=2的话,就直接乘在后边,不分了
}
}
}
输出的效率:
![image-20200721115730293]([编程题] lc[剑指 Offer 14_ I剪绳子(动态规划).assets/image-20200721115730293.png)
方法2:借助hashMap来减少时间复杂度
时间复杂度O(n)
Java代码
//方法2:使用哈希表来减少时间复杂度(O(n))
public int[] twoSum1(int[] numbers, int target) {
//备查的字典表
Map<Integer,Integer> hashMap = new HashMap<>(); //参数1存储数组元素值,参数2存储其数组元素索引
//把当前的数组元素按照键值对存入map
for(int i=0;i<numbers.length;i++){
hashMap.put(numbers[i],i);
}
for(int i=0;i<numbers.length;i++){
int cur = numbers[i];
int other = target-cur;
if(hashMap.containsKey(other)){
return new int[]{i+1,hashMap.get(other)+1};
}
}
//实在没找到的话,返回这个,本质题目设置是一定能找到的呀~
return new int[]{0,0};
}
输出:
![image-20200721115846282]([编程题] lc[剑指 Offer 14_ I剪绳子(动态规划).assets/image-20200721115846282.png)