zoukankan      html  css  js  c++  java
  • LeetCode解题报告—— Container With Most Water & 3Sum Closest & Letter Combinations of a Phone Number

    1.  Container With Most Water

    Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

    Note: You may not slant the container and n is at least 2.

    思路:可以遍历线条所有两两组合的情况来解,但是复杂度回达到O(n2),超时。采用另一种方法,从数组两端的点a1和an开始考虑,先计算a1和an所构成的Area,也就是a1和an中最短的那根线乘以a1到an x轴上的距离。然后开始往中间考虑,途中记录最大的Area。具体做法是,以a1 和 an为例,同时往左往右考虑,抛弃其中较短的线,因为对于a1和an中的较短者来说,x轴上的距离现在是最大了,也就是说不管剩下的那些线条比这个较短者(a1或者an)长还是短(因为装多少水取决于短板),所构成的Area都不会比原来a1和an构成的Area要大,所以在这个求最大Area的过程中可以直接将这个较短者剔除,移动至a2或者a(n-1)。再重复此步骤,每一步得到的Area都要和最大Area比较以实时更新。

    详细见:https://leetcode.com/problems/container-with-most-water/solution/

    import java.util.*;
    
    public class LeetCode{
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            String input=sc.nextLine();
            
            int[] nums=new int[input.length()];
            for(int i=0;i<input.length();i++){
                nums[i]=input.charAt(i)-'0';
            }
        }
        
        public static int maxArea(int[] height) {
            int maxarea = 0, l = 0, r = height.length - 1;
            while (l < r) {
                maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
                if (height[l] < height[r])
                    l++;
                else
                    r--;
            }
            return maxarea;
        }
    }        

    2. 3Sum Closest

    Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1.
    
    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

    解析:模仿3Sum那题的思路即可。

    import java.util.*;
    
    public class LeetCode{
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            String input=sc.nextLine();
            int n=sc.nextInt();
            
            String[] str=input.split(",| ");
            int[] nums=new int[str.length];
            for(int i=0;i<str.length;i++){
         // Integer.ParseInt() 方法将String转为int nums[i]
    =Integer.parseInt(str[i]); } System.out.println(closet(nums,n)); } public static int closet(int[] nums,int target) { Arrays.sort(nums);
       // Integer.MAX_VALUE
    int closet=Integer.MAX_VALUE; int closet_sum=0; for(int i=0;i<nums.length-2;i++){ int l=i+1,r=nums.length-1; while(l<r){ int sum=nums[i]+nums[l]+nums[r];
            // 利用 Math.abs()方法求绝对值
    if(Math.abs(sum-target)<closet){ closet=Math.abs(sum-target); closet_sum=sum; } if(sum-target>0) r--; else l++; } } return closet_sum; } }

     3. Letter Combinations of a Phone Number

     Given a digit string, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given below.

    Input:Digit string "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    思路:利用先进先出队列构造所有可能的组合,一开始进队列的应该是一个字母,进完后出队,每个与另一组中的字母组合成2个,进队,进完后再出队,与另一组中的字母组合构成3个,进队再出队,以此类推。

    import java.util.*;
    
    public class LeetCode{
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            String digits=sc.nextLine();
            List<String> letters=letterCombinations(digits);
            for(String s:letters)
                System.out.println(s);
        }
        
        public static List<String> letterCombinations(String digits) {
       // LinkedList 实现了 Queue 接口和 List 接口,能当作队列来用 LinkedList
    <String> letters=new LinkedList<String>();
       // 数组下标对应于输入的数字,值是数字对应的键盘上的字母 String[] mapping
    =new String[]{"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
       // 这里先往队列添个东西,因为空队列 remove 方法会抛异常 letters.add(
    ""); for(int i=0;i<digits.length();i++){ int x=digits.charAt(i)-'0';
         // 这里是个较难理解的点,i(digits的char索引,从0开始)和队列中目前的字母组合的长度(也就是1个字母还是2个字母或者0个字母空队列的情况)对应
    while(letters.peek().length()==i){ String s=letters.remove(); for(char c:mapping[x].toCharArray()){ letters.add(s+c); } } } return letters; } }
  • 相关阅读:
    深度学习训练模型时保存Log输出信息为文件
    Docker 测试场景领域应用剖析
    kafka性能测试
    [标点符] 初学机器学习算法之LightGBM (直方图+单边梯度采样优化+互斥特征绑定优化)
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    Linux安装Redis
  • 原文地址:https://www.cnblogs.com/f91og/p/8274672.html
Copyright © 2011-2022 走看看