我是靠谱客的博主 爱笑豌豆,最近开发中收集的这篇文章主要介绍leetcode每天5题-Day011.接雨水2.两数之和3.翻转二叉树4.最长公共前缀5.无序数组中最大的两个数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 1.接雨水
  • 2.两数之和
  • 3.翻转二叉树
  • 4.最长公共前缀
  • 5.无序数组中最大的两个数

1.接雨水

leetcode42.接雨水-困难
在这里插入图片描述
①动态规划
创建两个长度都为 n 的数组 leftMaxrightMax。对于0≤i<nleftMax[i] 表示下标 i及其左边的位置中,height 的最大高度,rightMax[i] 表示下标 i及其右边的位置中,height 的最大高度。

对于0≤i<n,下标 i 处能接的雨水量等于min(leftMax[i],rightMax[i])−height[i]
遍历每个下标位置即可得到能接的雨水总量。
时:O(n),其中 n 是数组height的长度。计算数组leftMaxrightMax 的元素值各需要遍历数组height 一次,计算能接的雨水总量还需要遍历一次。
空:O(n),其中 n 是数组height 的长度。需要创建两个长度为 n 的数组 leftMaxrightMax
单调栈(还未理解)
时:O(n)
空:O(n)
③双指针
空间优化:O(n)–>O(1),使用双指针和两个变量代替两个数组(leftMaxrightMax
时:O(n),其中 n 是数组height 的长度。两个指针的移动总次数不超过 n
空:O(1),只需要使用常数的额外空间。

2.两数之和

leetcode1.两数之和-简单
给定一个整数数组 nums 和一个整数目标值target,请你在该数组中找出 和为目标值target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
①暴力枚举
双重循环:找target-x
时:O(n²)
空:O(1)
②一遍遍历+哈希查找

var twoSum = function(nums, target) {
    //  一遍遍历+哈希查找
    const map=new Map();
    for(let i=0;i<nums.length;i++){
        const x=nums[i];
        if(map.has(target-x)){
            const index=map.get(target-x);
            return [i,index];
        }
        map.set(x,i);
    }
    return [];
};

时:O(n),其中 n 是数组中的元素数量。对于每一个元素 x,我们可以 O(1)地寻找 target - x。
空:O(n),其中 n 是数组中的元素数量。主要为哈希表的开销。

3.翻转二叉树

leetcode226.翻转二叉树-简单
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

①递归

var invertTree = function(root) {
    if(root==null) return null;
    // if(root.left)
    let temp=root.left;
    root.left=root.right;
    root.right=temp;
    invertTree(root.left);
    invertTree(root.right);
    return root;
};

时:O(n)
空:O(n)
②DFS(深度优先搜索)
③BFS(广度优先遍历)

4.最长公共前缀

leetcode14.最长公共前缀-简单
编写一个函数来查找字符串数组中的最长公共前缀
如果不存在公共前缀,返回空字符串 “”。
①横向扫描
依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。
时:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空:O(1),使用的额外空间复杂度为常数。
②纵向扫描
纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

	var longestCommonPrefix = function(strs) {
    // 纵向扫描
    if(!strs) return "";
    let len=strs[0].length;
    for(let i=0;i<len;i++){
        for(let j=1;j<strs.length;j++){
            if(i==strs[j].length||strs[0][i]!==strs[j][i]){
                return strs[0].substring(0,i);
            }
        }
    }
    return strs[0];
};

时:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空:O(1),使用的额外空间复杂度为常数。
③分治
④二分查找

5.无序数组中最大的两个数

参考:无序数组中找出最大的两个(K)数
这道题是室友面用友时问到的(java后端开发)
在网上搜了一下,发现力扣上也有
leetcode215.数组中的第K个最大元素-中等
在这里插入图片描述

自己先写了一下,直接排序,然后从数组中取第k大的元素…这也太拉跨了
在这里插入图片描述
这题应该用堆解决
练习如何建堆并进行堆排序,大顶堆 & 小顶堆
大顶堆的构建过程:最后一个非叶子结点的位置是:数组长度/2-1
①基于快速排序的选择方法

var findKthLargest = function(nums, k) {
    if(!nums) return;
    if(k>nums.length) return;

    // let random=Math.random();
    return quickSelect(nums,0,nums.length-1,nums.length-k);
};
var quickSelect=function(nums,l,r,index){
    let q=randomPartition(nums,l,r);
    if(q==index){
        return nums[q];
    }else{
        return q<index?quickSelect(nums,q+1,r,index):quickSelect(nums,l,q-1,index);
    }
}
var randomPartition=function(nums,left,right){
// 感觉随机数这里有点问题
    let i=Math.floor(Math.random()*(nums.length))-left;
    swap(nums,i,right);
    return partition(nums,left,right);
}
var partition=function(nums,left,right){
    let x=nums[right],i=left-1;
    for(let j=left;j<right;j++){
        if(nums[j]<=x){
            swap(nums,++i,j);
        }
    }
    swap(nums,i+1,right);
    return i+1;
}
var swap=function(nums,i,j){
    let temp=nums[i];
    nums[i]=nums[j];
    nums[j]=temp;
}

照着官方题解的java代码写的js,但运行时老有几个测试用例通过不了,执行代码时没问题,一提交就有错…感觉是生成随机数的问题
在这里插入图片描述
时:O(n)
空:O(logn)
????不理解
②基于堆排序的选择方法
大根堆的实现方法:建堆、调整、删除

var findKthLargest = function(nums, k) {
    let len=nums.length;
    buildMaxHeap(nums,len);
    for(let i=len-1;i>=len-k+1;--i){
        swap(nums,0,i);
        --len;
        maxHeapify(nums,0,len);
    }
    return nums[0];
};
var buildMaxHeap=function(nums,len){
    for(let i=Math.floor(len/2);i>=0;--i){
        maxHeapify(nums,i,len);
    }
}
var maxHeapify=function(nums,i,len){
    let l=i*2+1,r=i*2+2,largest=i;
    if(l<len&&nums[l]>nums[largest]){
        largest=l;
    }
    if(r<len&&nums[r]>nums[largest]){
        largest=r;
    }
    if(i!=largest){
        swap(nums,i,largest);
        maxHeapify(nums,largest,len);
    }
}
var swap=function(nums,i,j){
    let temp=nums[i];
    nums[i]=nums[j];
    nums[j]=temp;
}

在这里插入图片描述
这个也报错…我真的会谢…好像是内存的问题

时间复杂度:O(nlogn),建堆的时间代价是O(n),删除的总代价是O(klogn),因为 k < n,故渐进时间复杂为O(n+klogn)=O(nlogn)。
空间复杂度:O(logn),即递归使用栈空间的空间代价。

补上昨天的…进度太慢了…在这里插入图片描述

最后

以上就是爱笑豌豆为你收集整理的leetcode每天5题-Day011.接雨水2.两数之和3.翻转二叉树4.最长公共前缀5.无序数组中最大的两个数的全部内容,希望文章能够帮你解决leetcode每天5题-Day011.接雨水2.两数之和3.翻转二叉树4.最长公共前缀5.无序数组中最大的两个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部