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; } }
posted on 2018-01-14 23:18  f91og  阅读(196)  评论(0编辑  收藏  举报