[编程题] lc167两数之和 II - 输入有序数组

[编程题] 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)

posted @ 2020-07-21 12:00  北鼻coder  阅读(126)  评论(0编辑  收藏  举报