剑指Offer专项突击版题解八

news/2024/7/5 7:11:36

71.按权重生成随机数

思考:说到平均的生成随机数,想到了水塘抽样法和彩票调度法。

水塘抽样算法适合于样本不确定,乃至于是变化的,每个样本的概率是一样的。

// 样本nums[],每个元素的被抽到的概率是一样的
index := 0 
for i := 1; i <= len(nums); i++{
    if rand.Intn(i) == 0{
        index = nums[i-1]
    }
}
return index

彩票调度算法是一种类似于将概率体现在数轴上面,适用范围是样本已知。

nums [] // 表示每个样本的概率
sum := 0 // 表示总的概率数
for i := 0 ; i < len(nums); i++{
    sum += nums[i]
}
r := rand.Intn(sum) // 平均的随机从0-sum-1取出一个数
cv := 0 // 表示当前所处的位置
for i := 0; i < len(nums); i++{
    cv += nums[i]
    if cv > r{ // 获取被抽中的下标
       return i
    }
}

72.求平方根

思想:二分查找、牛顿迭代法。

func mySqrt(x int) int {
    if x == 0 {
        return 0
    }
    C, x0 := float64(x), float64(x)
    for {
        if math.Abs(x0 - xi) < 1e-7 {
            break
        }
        x0 = xi
    }
    return int(x0)
}

73.狒狒吃香蕉

思想:二分查找思想,因为目标答案明确。

74.合并区间

思想:按照区间排序之后再进行合并。

75.数组相对排序

思想:借助map存储排序的权制,在通过内置函数sort.Sllice进行排序。

76.数组中的第 k 大的数字

思想:快排序定位

77.链表排序

思路:暴力思路,将节点放到数组内然后进行排序。

进阶:归并排序的思想。

func sortList(head *ListNode) *ListNode {
    var mergeSort func(left, right *ListNode) *ListNode
    merge := func(left, right *ListNode) *ListNode {
        res := &ListNode{}
        tail := res
        for left != nil && right != nil{
            if left.Val > right.Val {
                tep := right
                right = right.Next
                tep.Next = nil
                tail.Next = tep
                tail = tep
            }else {
                tep := left
                left = left.Next
                tep.Next = nil
                tail.Next = tep
                tail = tep
            }
        }
        if left != nil{
            tail.Next = left
        }
        if right != nil{
            tail.Next = right
        }
        return res.Next
    }
    // 左闭右开
    mergeSort = func(left, right *ListNode) *ListNode {
        if left == nil {
            return nil
        }
        if left.Next == right {
            left.Next = nil
            return left
        }
        fast := left
        low := left
        for fast != right {
            low = low.Next
            fast = fast.Next
            if fast != right {
                fast = fast.Next
            }
        }
        mid := low
        return merge(mergeSort(left, mid), mergeSort(mid, right))
    }
    return mergeSort(head, nil)
}

 

78.合并排序链表

思路:归并思路好,如果采用普通的解法去做,进行循环遍历也能得出结果,但是时间复杂度比较高。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
    merge := func (a , b *ListNode)*ListNode{
        res := &ListNode{}
        tail := res
        for a != nil && b != nil{
            if a.Val > b.Val{
                tep := b
                b = b.Next
                tail.Next = tep
                tail = tep
            }else {
                tep := a
                a = a.Next
                tail.Next = tep
                tail = tep
            }
        }
        if a != nil{
            tail.Next = a
        }
        if b != nil{
            tail.Next = b
        }
        return res.Next
    }
    var MegerSort func(left , right int)*ListNode
    MegerSort = func (left , right int)*ListNode{
        if left == right{
            return lists[left]
        }
        mid := left + (right - left) / 2
        return merge(MegerSort(left , mid) , MegerSort(mid + 1 , right))
    }
    if len(lists) == 0{
        return nil
    }
    return MegerSort(0 , len(lists)-1)
}

79.所有子集

思路:dfs

80.含有 k 个元素的组合

思路:dfs


http://lihuaxi.xjx100.cn/news/903457.html

相关文章

(十五)、从插件市场引入问题反馈页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;插件市场问题反馈页面 插件市场链接 dloud插件插件市场中找到问题反馈插件&#xff1a; 首先确保登录了dcloud账号。 使用hbuilderX导入插件到自己项目中。 选择合并导入。 从插件市场导入意见反馈页面的路径地址如下&#xff1a; 2&#xff0c;点击跳转到…

千锋教育嵌入式物联网教程之系统编程篇学习-04

目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember()​ sigaddset()​ sigdelset()​ 代码讲解 信号阻塞集 sigprocmask()​ alarm函数 相当于一个闹钟&#xff0c;默认动作是终止调用alarm函数的进…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测

时序预测 | Python实现TCN时间卷积神经网络时间序列预测 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测预测效果基本介绍环境准备模型描述程序设计学习小结参考资料预测效果 基本介绍 递归神经网络 (RNN),尤其是 LSTM,非常适合时间序列处理。 作为研究相关技术…

New和Malloc的使用及其差异

1&#xff0c;new的使用关于new的定义&#xff1a;new其实就是告诉计算机开辟一段新的空间&#xff0c;但是和一般的声明不同的是&#xff0c;new开辟的空间在堆上&#xff0c;而一般声明的变量存放在栈上。通常来说&#xff0c;当在局部函数中new出一段新的空间&#xff0c;该…

华为OD机试 - 最短耗时(JS)

最短耗时 题目 给定一个正整型数组表示待系统执行的任务列表, 数组的每一个元素代表一个任务,元素的值表示该任务的类型。 请计算执行完所有任务所需的最短时间。 任务执行规则如下: 任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位。两个同类型的任务之间必…

Java面向对象的特性:封装,继承与多态

Java面向对象的特性 在学习Java的过程是必须要知道的Java三大特性&#xff1a;封装、继承、多态。如果要分为四类的话&#xff0c;加上抽象特性。 封装 1.封装概述 是面向对像三大特征之一&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09; 是面向对象编程语言对客…

使用迭代器遍历List抛出ConcurrentModificationException异常分析。

目录异常复现原因分析例子源码分析解决方案异常复现 使用迭代器对java中List遍历时&#xff0c;程序抛出了ConcurrentModificationException异常。这是由于Java的 fast-fail 机制&#xff08;快速失败&#xff09;导致的&#xff0c;可以提前预料遍历失败情况。看下面的例子。 …

LeetCode-1792. 最大平均通过率【堆,优先队列,贪心】

LeetCode-1792. 最大平均通过率【堆&#xff0c;优先队列&#xff0c;贪心】题目描述&#xff1a;解题思路一&#xff1a;优先队列。首先任何一个班级(x,y)加入一个聪明的学生之后增加的通过率为diff(x1)/(y1)-x/y。那么对p进行堆排序&#xff0c;每次取最大的即可。解题思路二…