IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指offer 2021/8/5 -> 正文阅读

[数据结构与算法]剑指offer 2021/8/5

41. 数据流中的中位数

代码:

创建一个大顶堆一个小顶堆,大顶堆中保存较大的元素,小顶堆中保存较小的元素。

class MedianFinder {

    /** initialize your data structure here. */
    Queue<Integer> A,B;
    public MedianFinder() {
        //小顶堆(默认),且堆中保存较大的元素
        A=new PriorityQueue<>();
        //大顶堆(用lambda表达式实现接口),且堆中保存较小的元素
        B=new PriorityQueue<>((a,b)->b-a);
    }
    
    public void addNum(int num) {
        //A、B中元素数量不同,则向B中添加元素(即先向A中添加元素,然后将A的堆顶元素加入到B中)
        //这样可以保证B中始终存放较小的元素
        if(A.size()!=B.size()){
            A.add(num);
            B.add(A.poll());
        }
        //A、B中数量相同,则向A中添加元素(即现象B中添加元素,然后将B的堆顶元素加入到A中)
        //这样可以保证A中始终存放较大的元素
        else{
            B.add(num);
            A.add(B.poll());
        }
    }
    
    public double findMedian() {
        //A、B中元素数量不等,则返回A的堆顶元素,否则,返回A、B堆顶元素之和除以2
        //注意除数一定要写成2.0,否则计算会出错!
        return A.size()!=B.size() ? A.peek() : (A.peek()+B.peek())/2.0;
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

注意:

PriorityQueue()默认是一个小顶堆

28. 对称的二叉树

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        //当root为null时返回true,否则,递归遍历左右子树
        return root==null ? true : recur(root.left, root.right);
    }
    boolean recur(TreeNode L, TreeNode R){
        //如果左右子树为空,返回true
        if(L==null && R==null)  return true;
        //如果只有左子树/右子树为空,或者左右子树值不相等,返回false
        if(L==null || R==null || L.val!=R.val)
            return false;
        //判断L的左子树和R的右子树,以及L的右子树和R的左子树是否对称
        return recur(L.left, R.right) && recur(L.right, R.left);
    }
}

56 - II. 数组中数字出现的次数 II

代码:

class Solution {
    public int singleNumber(int[] nums) {
        int[] count = new int[32];
        int res=0;
        //计算所有数字各个位之和
        //对每一个数字进行计数
        for(int i = 0; i < nums.length; ++i){
            //对每一位进行计数
            for(int j = 0; j < 32; ++j){
                count[j] += nums[i] & 1;
                nums[i] >>>= 1;
            }
        }
        //将每一位count的值模三
        for(int i = 0; i < 32; ++i){
            count[i] %= 3;
        }
        //将count的值赋给res的各个位
        for(int i = 0; i < 32; ++i){
            res <<= 1;
            res |= count[31-i];
        }
        return res;
    }
}

注意

1.>>:带符号右移
>>>:无符号右移

43. 1~n 整数中 1 出现的次数

代码:

算法思想

class Solution {
    public int countDigitOne(int n) {
        int digit=1, res=0, high = n/10, cur = n%10, low = 0;
        while(high !=0 || cur != 0){
            if(cur==0){
                res += high*digit;
            }else if(cur==1){
                res += high*digit + low + 1;
            }else{
                res += (high+1)*digit;
            }
            low += cur*digit;
            cur=high%10;
            high/=10;
            digit*=10;
        }
        return res;
    }
}

65. 不用加减乘除做加法

代码:

算法思想

class Solution {
    public int add(int a, int b) {
        //从第二轮开始,b存放的值是进位,若进位为0,则a为最终答案
        while(b!=0){
            //c计算进位
            int c=(a&b)<<1;
            //a用来存放非进位和
            a=a^b;
            b=c;
        }
        return a;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 10:05:03  更:2021-08-06 10:05:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:53:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码