• 每日刷题记录 (十)


    第一题: 剑指 Offer II 072. 求平方根

    LeetCode: 剑指 Offer II 072. 求平方根

    描述:
    给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。

    正数的平方根有两个,只输出其中的正数平方根。

    如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。
    在这里插入图片描述

    解题思路:

    1. 这里使用二分法
    2. 每次比较 mid * mid 是否小于等于 x
      • 如果当前小于等于x, 让left = mid+1;
      • 如果当前大于x, 让right = mid -1;
    3. 最终返回left-1;

    代码实现:

    class Solution {
        public int mySqrt(int x) {
            int left = 0;
            int right = x;
            while(left <= right) {
                int mid = left + (right - left) / 2;
                if ((long)mid * mid <= x) {
                    left = mid + 1;
                }else {
                    right = mid - 1;
                }
            }
            return left-1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第二题: 剑指 Offer II 074. 合并区间

    LeetCode: 剑指 Offer II 074. 合并区间

    描述:
    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
    在这里插入图片描述

    解题思路:

    1. 首先根据左边界进行排序.
    2. 如果下一个范围的左边界, 大于当前范围的右边界, 就把当前记录的left和right加入到结果集中. 并标记当前left 为下一个范围的左边界
    3. 让right标记, 当前右边界, 和下一个范围的右边界的最大值,
    4. 遍历结束返回结果集

    代码实现:

    class Solution {
        public int[][] merge(int[][] intervals) {
        	// 先排序
            Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);
            List<int[]> res = new ArrayList<>();
            // 先记录left和right
            int left = intervals[0][0];
            int right = intervals[0][1];
            for(int i = 1; i < intervals.length; i++) {
                if (right < intervals[i][0]) {
                    // 当下一范围的左边界大于前一范围的有边界的时候, 加入结果集, 并重新标记左边界的位置.
                    res.add(new int[]{left,right});
                    left = intervals[i][0];
                }
                // 记录最大右边界位置
                right = Math.max(intervals[i][1],right);
            }
            // 这里还需要添加一次, 最后一次没有加入进去
            res.add(new int[]{left,right});
            int[][] ans = new int[res.size()][];
            for(int i = 0; i < res.size(); i++) {
                ans[i] = res.get(i);
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    第三题: 剑指 Offer II 075. 数组相对排序

    LeetCode: 剑指 Offer II 075. 数组相对排序
    描述:
    给定两个数组,arr1arr2

    • arr2 中的元素各不相同
    • arr2 中的每个元素都出现在 arr1

    arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

    在这里插入图片描述

    解题思路:

    • 首先使用一个数组tmp , 记录 arr1 中每一个元素出现的次数.
    • 再遍历 arr2 数组, 查看tmp中该元素出现的次数, 然后添加到结果数组中res
    • 再去遍历tmp. 查看tmp中剩余的元素, 加入到res中, 由于是按坐标来添加的, 所以自动就是排序的.

    代码实现:

    class Solution {
        public int[] relativeSortArray(int[] arr1, int[] arr2) {
        	// 这里使用tmp数组来记录每个元素出现次数
            int[] tmp = new int[1001];
            for (int val : arr1) {
                tmp[val]++;
            }
            int index = 0;
            int[] res = new int[arr1.length];
            // 按照arr2的顺序, 将元素加入到结果数组, 出现几次加入几个
            for(int val : arr2) {
                while(tmp[val]-- != 0) {
                    res[index++] = val;
                }
            }
            // 剩余的元素, 就是需要继续加的.
            for(int i = 0; i < 1001; i++) {
                if(tmp[i] != 0) {
                    while(tmp[i]-- > 0) {
                        res[index++] = i;
                    }
                }
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    第四题: 剑指 Offer II 076. 数组中的第 k 大的数字

    LeetCode: 剑指 Offer II 076. 数组中的第 k 大的数字

    描述:
    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
    在这里插入图片描述

    解题思路:

    1. 这里使用优先级队列. 创建一个大小为k的小根堆.
    2. 当队列大小小于k的时候, 直接入堆
    3. 当队列大小大于等于k的时候, 比较元素和堆顶元素的大小.
      • 当元素大于堆顶元素的时候, 出堆顶元素. 然后将该元素入堆

    代码实现:

    class Solution {
        public int findKthLargest(int[] nums, int k) {
            PriorityQueue<Integer> pq = new PriorityQueue<>(k);
            for(int i = 0; i < k; i++) {
                pq.offer(nums[i]);
            }
            for(int i = k; i < nums.length; i++) {
                if(nums[i] > pq.peek()) {
                    pq.poll();
                    pq.offer(nums[i]);
                }
            }
            return pq.peek();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第五题: 剑指 Offer II 035. 最小时间差

    LeetCode: 剑指 Offer II 035. 最小时间差

    描述:
    给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
    在这里插入图片描述

    解题思路:

    1. 首先将时间字符串转化成分钟时间
    2. 然后进行排序,
    3. 这里注意, 00:01 和 23:59, 的时间差, 会被省略掉, 解决办法 就是让最小的时间加上24*60.
    4. 然后俩俩进行计算时间差, 记录最小时间差

    代码实现:

    class Solution {
        public int findMinDifference(List<String> timePoints) {
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < timePoints.size(); i++) {
                list.add(getMin(timePoints.get(i)));
            }
            Collections.sort(list);
            list.add(list.get(0) + 24*60);
            int res = Integer.MAX_VALUE;
            for(int i = 1; i < list.size(); i++) {
                res = Math.min(res,list.get(i)-list.get(i-1));
            }
            return res;
        }
        public int getMin(String str) {
            String[] time = str.split(":");
            return Integer.parseInt(time[0])*60 +Integer.parseInt(time[1]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    第六题: 剑指 Offer II 034. 外星语言是否排序

    LeetCode: 剑指 Offer II 034. 外星语言是否排序

    描述:
    某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。

    给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。
    在这里插入图片描述

    解题思路:

    1. 根据order字符串出现的顺序, 用一个数组arr来记录.
    2. 两两字符串进行比较, 首先比较每个位置元素的出现顺序
      • 如果left<rigth, 表示符合条件, 继续进行下两个字符串的比较
      • 如果left>right, 直接不符合条件返回false
      • 如果前面字符串都相等, 例如 wwwww, 那么比较两个字符串的长度.

    代码实现:

    class Solution {
        public boolean isAlienSorted(String[] words, String order) {
            int[] arr = new int[26];
            for(int i = 0; i < order.length(); i++) {
                arr[order.charAt(i)-'a'] = i;
            }
            for(int i = 1; i < words.length; i++) {
                boolean flg = true;
                for(int j = 0; j < words[i-1].length() && j < words[i].length() ; j++) {
                    int left = arr[words[i-1].charAt(j)-'a'];
                    int right = arr[words[i].charAt(j)-'a'];
                    if (left < right) {
                        flg = false;
                        break;
                    }else if (left > right) {
                        return false;
                    }
                }
                if (flg) {
                    if (words[i-1].length() > words[i].length()){
                        return false;
                    }
                }
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    【STM32&RT-Thread零基础入门】8. 基于 CubeMX 移植 RT-Thread Nano
    代码随想录训练营第27天|LeetCode 39. 组合总和、40.组合总和II、 131.分割回文串
    Unity Shader入门精要学习——透明效果
    捕捉数组越界访问问题
    NIO讲解
    用OpenCV进行图像分割--进阶篇
    系统架构设计师之备考攻略(2022年修订版)——一篇就够
    抖音矩阵系统,抖音矩阵系统源码定制 tell me
    爆肝!阿里最新版的Spring Security源码手册,强行霸占GitHub榜首
    javascript基础
  • 原文地址:https://blog.csdn.net/wwzzzzzzzzzzzzz/article/details/125556749