2021-01-13

jxh

JAVA实现leetcode11,14,15题

11.盛最多水的容器

题目描述

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水的最大值为 49。

示例 2:
输入:height = [1,1]
输出:1

示例 3:
输入:height = [4,3,2,1,4]
输出:16

示例 4:
输入:height = [1,2,1]
输出:2

提示:
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104

思路

本题利用双指针,在两头的指针逐个向中间移动,哪边指针数值小就移动哪边,并记录max值

代码
class Solution {
    
    
    public int maxArea(int[] height) {
    
    
        int max=0;
        for(int i=0,j=height.length-1;i<j;){
    
    
            int Height=height[i]<height[j]?height[i++]:height[j--];
            max=Math.max(max,(j-i+1)*Height);
        }
        return max;
    }
}

最长公共前缀

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。

提示:
0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

思路

让字符数组的第一个元素的各个值去跟后面不断比较,
复杂度O(n^2)

代码
class Solution {
    
    
    public String longestCommonPrefix(String[] strs) {
    
    
        if(strs==null || strs.length==0){
    
    
            return "";
        }
        int l=strs.length;
        int k=strs[0].length();
        int s=0;
        for(int i=0;i<k;i++){
    
    
            int sum=0;
            for(int j=0;j<l;j++){
    
    
                if(strs[j].length()>i && strs[0].charAt(i)==strs[j].charAt(i)){
    
    
                    sum++;
                }
                else break;
            }
            if(sum==l){
    
    
              s++;  
            }
            else break;
        }
        return strs[0].substring(0,s);
    }
}

15.三数之和

题目描述

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:
输入:nums = []
输出:[]

示例 3:
输入:nums = [0]
输出:[]

思路

不好意思我太笨了超时了,暴力美学O(n^3),先对数组排下序,再加个判断条件剔除相同的

代码
class Solution {
    
    
    public List<List<Integer>> threeSum(int[] nums) {
    
    
        List<List<Integer>> ans=new ArrayList<>();
        if(nums.length<3){
    
    
            return ans;
        }
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
    
    
            if(i>=1&&nums[i]==nums[i-1]){
    
    
                continue;
            }
            for(int j=i+1;j<nums.length-1;j++){
    
    
                if(j>=i+2&&nums[j]==nums[j-1]){
    
    
                continue;
            }
                for(int k=j+1;k<nums.length;k++){
    
    
                    if(k>=j+2&&nums[k]==nums[k-1]){
    
    
                        continue;
                    }
                    if(nums[i]+nums[j]+nums[k]==0){
    
    
                        ans.add(Arrays.asList(nums[i],nums[j],nums[k]));
                    }
                        // ans.add(Arrays.asList(nums[i],nums[j],nums[k]));
                    }
                }
            }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45847565/article/details/112580800