面试经典150题(101-104)

leetcode 150道题 计划花两个月时候刷完之未完成后转,今天(第1天)完成了4道(101-104)150:

101.(215. 数组中的第K个最大元素) 题目描述:

bash 复制代码
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

第一版(这个题看了好几天。。复习了快排的写法,也算有收获,最后还是看了解题)

java 复制代码
class Solution {
    Random random=new Random();
    public int findKthLargest(int[] nums, int k) {
        return quickSort(nums,0,nums.length-1,nums.length-k);
    }
    public int quickSort(int[] nums, int left,int right,int k){
        if(left>=right){
            return nums[k];
        }
        int randomIndex=left+random.nextInt(right-left+1);
        swap(nums,left,randomIndex);
        int middleNum=nums[left];
        int leftTemp=left+1;
        int rightTemp=right;
        while(leftTemp<=rightTemp){
            while(leftTemp<=rightTemp&&nums[rightTemp]>middleNum){
                rightTemp--;
            }
            while(leftTemp<=rightTemp&&nums[leftTemp]<middleNum){
                leftTemp++;
            }
            if(leftTemp>=rightTemp){
                break;
            }
            swap(nums,leftTemp,rightTemp);
            leftTemp++;
            rightTemp--;
        }
        swap(nums,left,rightTemp);
        if(k==rightTemp){
            return nums[rightTemp];
        }else if(k>rightTemp){
            return quickSort(nums,rightTemp+1,right,k);
        }else{
           return quickSort(nums,left,rightTemp-1,k);
        }
    }
    public void swap(int[] nums, int left,int right){
        int temp=nums[left];
        nums[left]=nums[right];
        nums[right]=temp;
    }
}

第二版(用了java 自带的堆集合,大堆根)

java 复制代码
class Solution {
    public int findKthLargest(int[] nums, int k) {
        int len=nums.length;
        PriorityQueue<Integer> priorityQueue=new PriorityQueue<Integer>(len,
        (o1,o2)->o2.compareTo(o1));
        for(int num:nums){
            priorityQueue.offer(num);
        }
        for(int i=0;i<k-1;i++){
            priorityQueue.poll();
        }
        return priorityQueue.peek();
    }
}

102.(373. 查找和最小的 K 对数字)题目描述:

bash 复制代码
给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。
请找到和最小的 k 个数对 (u1,v1),  (u2,v2)  ...  (uk,vk) 。

第一版(我一上来就是全部结果拿到然后排序返回前K个,然后报超时,解题的去重不是很好的理解的。意思就是先将开头的放进去,然后下面取下一个要出现的组合时候只需要向右找就行这样就不会重复了)

java 复制代码
class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<List<Integer>> res=new ArrayList();
        PriorityQueue<int[]> priority=new PriorityQueue<int[]>(k,(o1,o2)->{
            return nums1[o1[0]]+nums2[o1[1]]-nums1[o2[0]]-nums2[o2[1]];
        });
        int m=nums1.length;
        int n=nums2.length;
        for(int i=0;i<Math.min(m,k);i++){
            priority.offer(new int[]{i,0});
        }
        while(k-->0&&!priority.isEmpty()){
            int[] temp=priority.poll();
            List<Integer> list=new ArrayList();
            list.add(nums1[temp[0]]);
            list.add(nums2[temp[1]]);
            res.add(list);
            if(temp[1]+1<n){
                priority.offer(new int[]{temp[0],temp[1]+1});
            }
        }
        return res;

    }
}

103.(67. 二进制求和)题目描述:

bash 复制代码
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 :
输入:a = "11", b = "1"
输出:"100"

第一版(用java自带的api先转为整数相加然后再转为2进制会超长,所以只能慢慢算,我写的有点啰嗦。。)

java 复制代码
class Solution {
    public String addBinary(String a, String b) {
        StringBuilder sb=new StringBuilder();
        int lenA=a.length();
        int lenB=b.length();
        int indexA=lenA-1;
        int indexB=lenB-1;
        boolean flag=false;
        while(indexA>=0&&indexB>=0){
            if(flag){
                if(a.charAt(indexA)=='1'&&b.charAt(indexB)=='1'){
                    sb.insert(0,'1');
                }else if(a.charAt(indexA)=='1'||b.charAt(indexB)=='1'){
                    sb.insert(0,'0');
                }else{
                    sb.insert(0,'1');
                    flag=false;
                }
            }else{
                if(a.charAt(indexA)=='1'&&b.charAt(indexB)=='1'){
                    sb.insert(0,'0');
                    flag=true;
                }else if(a.charAt(indexA)=='1'||b.charAt(indexB)=='1'){
                    sb.insert(0,'1');
                }else{
                    sb.insert(0,'0');
                }
            }
            indexA--;
            indexB--;
        }
        while(indexA>=0){
            if(flag){
                if(a.charAt(indexA)=='1'){
                    sb.insert(0,'0');
                }else{
                    sb.insert(0,'1');
                    flag=false;
                }
            }else{
                if(a.charAt(indexA)=='1'){
                    sb.insert(0,'1');
                }else{
                    sb.insert(0,'0');
                }
            }
            indexA--;
        }
        while(indexB>=0){
            if(flag){
                if(b.charAt(indexB)=='1'){
                    sb.insert(0,'0');
                }else{
                    sb.insert(0,'1');
                    flag=false;
                }
            }else{
                if(b.charAt(indexB)=='1'){
                    sb.insert(0,'1');
                }else{
                    sb.insert(0,'0');
                }
            }
             indexB--;
        }
        if(flag){
            sb.insert(0,'1');
        }
        return sb.toString();
    }
}

104.(190. 颠倒二进制位)题目描述:

bash 复制代码
颠倒给定的 32 位无符号整数的二进制位。

第一版(java 有自带的 api )

java 复制代码
public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        return Integer.reverse(n);
    }
}

第二版(位运算)

java 复制代码
public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int num=0;
        for(int i=1;i<=32;i++)
        {
            num<<=1;//先向左移动一位留出位置
            //取出 n 的最后一位
            int p=(n&1);
            num+=p;
            n>>=1;
        }
        return num; 
    }
}

年过完了。。亲也相完了。。回归正常!!!

相关推荐
ptu小鹏2 分钟前
list重点接口及模拟实现
数据结构·c++·list
冲帕Chompa2 小时前
图论part10 bellman_ford算法
数据结构·算法·图论
緈福的街口2 小时前
【leetcode】144. 二叉树的前序遍历
算法·leetcode
GG不是gg2 小时前
排序算法之基础排序:冒泡,选择,插入排序详解
数据结构·算法·青少年编程·排序算法
随意起个昵称2 小时前
【双指针】供暖器
算法
倒霉蛋小马2 小时前
最小二乘法拟合直线,用线性回归法、梯度下降法实现
算法·最小二乘法·直线
codists3 小时前
《算法导论(第4版)》阅读笔记:p82-p82
算法
埃菲尔铁塔_CV算法3 小时前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
Dream it possible!3 小时前
LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
c++·leetcode·哈希算法
float_com3 小时前
【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)
算法·动态规划