数据结构和算法
文章平均质量分 72
想名真难
这个作者很懒,什么都没留下…
展开
-
布丰投针计算圆周率:Python实现
如图,由于y可以取0到d/2的任何数,因此针中点的所有可能性(所有y)构成长为d/2的线段。随着θ的变化,该可能性并不会变化,因此所有可能性形成面积为的粉色矩形。布丰投针问题:设我们有一个以平行且等距木纹铺成的地板,随意抛一支长度比木纹之间距离小的针,可统计出针和其中一条木纹相交的概率,根据这个概率可以得出圆周率。随着θ的变化,该可能性变化,因此所有可能性形成面积为S2的蓝色图形。例如,方法二中π的来自于 S1,更本质地说,是来自于针与平行线夹角的积分上限(范围)。这两件事,有一点点的关系么?转载 2024-10-21 21:40:40 · 44 阅读 · 0 评论 -
leetcode 41. 缺失的第一个正数
给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。原创 2023-11-26 16:42:04 · 624 阅读 · 0 评论 -
leetcode 2439. 最小化数组中的最大值
削峰填谷,整体考虑,遇到第i个时,把第i个当成最后一个,把前i-1个都当成一个数字进行处理。计算前i个数字的平均值向上取整,此时相当于把前i个的山峰削减完成,前i个的最大值就是平均值向上取整,然后继续第i+1个。原创 2023-01-01 23:30:30 · 1267 阅读 · 0 评论 -
LeetCode392. 判断子序列
给定字符串s和t,判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。原创 2022-12-01 20:27:10 · 712 阅读 · 0 评论 -
LeetCode 455. 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。,这是能让孩子们满足胃口的饼干的最小尺寸;你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。,我们可以将这个饼干。原创 2022-11-06 22:08:34 · 523 阅读 · 0 评论 -
LeetCode 1189. “气球” 的最大数量
给你一个字符串text,你需要使用text中的字母来拼凑尽可能多的单词"balloon"(气球)。字符串text中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词"balloon"。原创 2022-11-05 19:44:20 · 367 阅读 · 0 评论 -
LeetCode 1701. 平均等待时间
本题可以看作是《操作系统》中的《先来先服务调度算法》的实现,把厨师看作是单核cpu,把顾客看作是就绪队列中的等待进程,由于厨师按顾客到达顺序进行服务,也就是cpu按进程的到达顺序来选择进程i占用 cpu 执行。原创 2022-11-05 19:10:45 · 177 阅读 · 0 评论 -
LeetCode - 1700. 无法吃午餐的学生数量
最前面的学生拿走最顶上的三明治,剩余学生队列为 students = [0,1,1],三明治栈为 sandwiches = [1,0,1]。- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [1,0,0,1]。- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [0,0,1,1]。输入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]餐厅里三明治的数量与学生的数量相同。原创 2022-10-30 18:52:32 · 726 阅读 · 0 评论 -
剑指 Offer II 070 排序数组中只出现一次的数字
给定一个只包含整数的有序数组 nums,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。原创 2022-10-04 18:31:23 · 482 阅读 · 0 评论 -
LeetCode_997_找到小镇的法官
小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。如果小镇法官真的存在,那么:小镇法官不会信任任何人。 每个人(除了小镇法官)都信任这位小镇法官。 只有一个人同时满足属性 1 和属性 2 。给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。示例 1:输入:n = 2, trust = [[1,2原创 2022-05-15 19:31:31 · 203 阅读 · 0 评论 -
LeetCode 211.添加与搜索单词, swift
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。实现词典类 WordDictionary :WordDictionary() 初始化词典对象void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配bool search(word) 如果数据结构中存在字符串与word 匹配,则返回 true ;否则,返回false 。word 中可能包含一些 '.' ,每个. 都可以表示任何一个字母。WordDictionar...原创 2022-05-01 21:14:25 · 1016 阅读 · 0 评论 -
LCP 28 采购方案
小力将 N 个零件的报价存于数组 nums。小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案。注意:答案需要以(1000000007) 为底取余,如:计算初始结果为:1000000008,请返回1示例 1:输入:nums = [2,5,3,5], target = 6输出:1解释:预算内仅能购买 nums[0] 与 nums[2]。示例 2:输入:nums = [2,2,1,9], target = 10输出:4原创 2022-03-20 16:14:06 · 4256 阅读 · 0 评论 -
判断链表是否是镜像, 回文链表
请判断一个链表是否为回文链表。输入: 1->2 输出: false输入: 1->2->2->1 输出: true输入: 1->2->3->2->1 输出: true原创 2021-04-11 20:04:31 · 225 阅读 · 0 评论 -
最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列(严格递增) 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。输入:nums = [1,3,5,4,7]输出:3解释:最长连续递增序列是 [1,3,5], .原创 2021-01-30 20:31:59 · 1055 阅读 · 0 评论 -
股票的最大利润2
给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 ...原创 2021-01-30 19:03:30 · 2737 阅读 · 0 评论 -
0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。输入: [0,1,3]输出: 2输入: [0,1,2,3,4,5,6,7,9]输出: 8特殊例子:输入: [0]输出: 1输入:[1]输出: 0class Solution { func missingNumber(_ nums: [Int]) -> Int { let c..原创 2021-01-24 18:12:18 · 293 阅读 · 0 评论 -
给定一个整数n,返回n!结果尾数中零的数量
给定一个整数n,返回n! 结果尾数中零的数量。输入: 3输出: 0解释:3! = 6, 尾数中没有零。输入: 5输出: 1解释:5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为O(logn)。首先肯定不能依赖于把阶乘算出来再去判断有多少个零了,因为阶乘很容易就溢出了,所以先一步一步理一下思路吧。首先末尾有多少个 0 ,只需要给当前数乘以一个 10 就可以加一个 0。再具体对于 5!,也就是 5 * 4 * 3 * 2 * 1 = 120,我们...原创 2021-01-24 17:08:27 · 2369 阅读 · 0 评论 -
和为K的子数组
给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。暴力法还是比较好想的, 按照题目要求, 把每种情况都列出来, 然后统计出结果就行了. 总共需要O(n^2)的时间复杂度, 自然是结果正确, 但是超时.class Solution { func subarraySum(_ nums: [Int], _ k: Int) -> ...原创 2021-01-17 22:35:58 · 449 阅读 · 0 评论 -
检查数组中整数及其两倍数是否存在
给你一个整数数组arr,请你检查是否存在两个整数N 和 M,满足N是M的两倍(即,N = 2 * M)。更正式地,检查是否存在两个下标i 和 j 满足:i != j0 <= i, j < arr.lengtharr[i] == 2 * arr[j]输入:arr = [10,2,5,3]输出:true解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。输入:arr = [7,1,14,11]输出:true解释:N = 14 是...原创 2021-01-10 21:30:34 · 546 阅读 · 0 评论 -
赎金信, 字符串A能否完全被字符串B包含
给定一个ransom字符串和一个magazine字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。你可以假设两个字符串均只含有小写字母。canConstruct("a", "b") -> falsecanConstruct("aa", "ab") -> falsecanConstruct("aa", "aab") -> true思路还是比较简单的, 第二个字符串做成一个..原创 2021-01-10 21:01:13 · 118 阅读 · 0 评论 -
寻找数组中的峰值(极大值)
峰值元素是指其值大于左右相邻值的元素。给定一个输入数组nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设nums[-1] = nums[n] = -∞。输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该返回其索引 2。输入: nums = [1,2,1,3,5,6,4]输出: 1 或 5解释: 你的函数可以返回索引 1,其峰值元素为...原创 2021-01-10 20:10:36 · 5904 阅读 · 1 评论 -
盛最多水的容器
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。输入:height = [1,...原创 2021-01-09 21:52:33 · 96 阅读 · 0 评论 -
统计数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0题目很简单, 做起来也确实容易, 但是面试官肯定不是想要暴力法的, 而且思路很多, 要是能说出来几种不同的思路, 绝对会让人眼前一亮的.1. 暴力法, 从开始遍历, 如果相等, 就把result+1, 直到结束. 最原始的暴力法, 有一个小地方可以优化, 就是结..原创 2020-10-02 23:03:48 · 1394 阅读 · 0 评论 -
回溯法, 数组的子集
给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。输入: nums = [1,2,3]输出:[ [3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]链接:https://leetcode-cn.com/problems/subsets在快手的面试中遇到了这个题, 知道需要用回溯法枚举出所有的场景, 但是在写的过程中, 还是有点卡壳.先把最开始的思路写上...原创 2020-09-21 19:36:48 · 506 阅读 · 0 评论 -
数组接雨水
给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6哈哈哈, 不少人第一眼看到这个都是懵的, 好像完全没有学过的知识点可以指出思路. 好在计算机就是计算能力强, 用暴力法处理试试.按照题目要求, 一个位置i能积水, 那么左边肯定有比he.原创 2020-09-19 16:29:04 · 287 阅读 · 0 评论 -
数组中的重复元素, 在距离小于k内是否有相同元素
给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且 i 和 j的差的 绝对值 至多为 k。输入: nums = [1,2,3,1], k = 3输出: true输入: nums = [1,0,1,1], k = 1输出: true输入: nums = [1,2,3,1,2,3], k = 2输出: falsehttps://leetcode-cn.com/problems/contains-duplicat...原创 2020-09-15 19:18:25 · 306 阅读 · 0 评论 -
数组中的重复元素, 最终boss
在整数数组 nums 中,是否存在两个下标 i 和 j,使得nums [i] 和nums [j]的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 k。如果存在则返回 true,不存在返回 false。输入: nums = [1,2,3,1], k = 3, t = 0输出: true输入: nums = [1,0,1,1], k = 1, t = 2输出: true输入: nums = [1,5,9,1,5,9], k = 2, t = 3输出: false...原创 2020-09-15 18:07:23 · 248 阅读 · 0 评论 -
字符串相乘
给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。输入: num1 = "2", num2 = "3"输出: "6"输入: num1 = "123", num2 = "456"输出: "56088"https://leetcode-cn.com/problems/multiply-stringsclass Solution { func multiply(_ num1: Str...原创 2020-09-14 16:18:35 · 2398 阅读 · 0 评论 -
超级回文数
如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。现在,给定两个正整数 L 和 R (以字符串形式表示),返回包含在范围 [L, R] 中的超级回文数的数目。https://leetcode-cn.com/problems/super-palindromes/回文数: 就是正序读和反序读是同一个数字, 比如121, 正序是"121", 反序还是"121", 这样就是回文数.输入:L = "4", R = "1000"输出:4解释:4,9,1...原创 2020-09-07 12:45:23 · 890 阅读 · 0 评论 -
哈希树 (HashTree)
在讲hash树之前首先我们来理解一下质数分辨定理。 什么是质数分辨定理? 什么是质数 : 即只能被 1 和 本身 整除的数。 为什么用质数:因为N个不同的质数可以 ”辨别“ 的连续整数的数量,与这些质数的乘积相同。 百度文库解答:https://wenku.baidu.com/view/16b2c7abd1f34693daef3e58.html 也就是说如果有21亿个数字的话,我们查找的哪怕是最底...转载 2020-08-26 16:31:49 · 6500 阅读 · 2 评论 -
二叉树找到每层的最大元素
在二叉树的每一行中找到最大的值。https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/输入: 1 / \ 3 2 / \ \ 5 3 9输出: [1, 3, 9]每层中的最大元素, 自然想到了使用层次遍历, 但是层次遍历是不清楚层的开始和结束的, 所以还需要对层次遍历进行一下改造.先说下标准的层次遍历...原创 2020-08-12 16:10:05 · 1694 阅读 · 0 评论 -
股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。对于绝大多数人来说, 第一反应...原创 2020-08-06 12:32:55 · 550 阅读 · 0 评论 -
判断单链表是否有环, 找到入口点, 环的长度....
给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,然后总结一下大概可以涉及到的问题,以及相应的解法。首先,关于单链表中的环,一般涉及到一下问题:1.给一个单链表,判断其中是否有环的存在;2.如果存在环,找出环的入口点;3.如果存在环,求出环上节点的个数;4.如果存在环,求出链表的长度;5.如果存在环,求出环上距离任意一个节点最远的点(对面节点);6.(扩展)如何判断两个无环链表是否相交;7.(扩展)如果相交,求出第一个相交的.转载 2020-08-02 18:26:41 · 329 阅读 · 0 评论 -
快速排序 --- 排序算法5
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然最坏情况的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下原创 2020-07-31 17:52:15 · 141 阅读 · 0 评论 -
归并排序 --- 排序算法4
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序, 每次的小循环和合并2个有序链表有点类似. 1.把原始数组看成n个小数组组成的,每个小数组都是有序的, 2.相邻的2个数字合并成一个有序数组, 3.相邻的4个数字合并成一个有序数组, .... 最后所有数字合并变成一个有序数组.- (void)sortAction { ...原创 2020-07-31 16:04:50 · 126 阅读 · 0 评论 -
希尔排序 --- 排序算法2
先从直接插入排序说起,直接插入排序的效率在某些时侯是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。 希尔排序是直接插入排序的改进版, 首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对分组就行直接插入排序, 把大规模无序数据转成了基本有序数据, 降低了时间复杂度 , 希尔排序是第一批突破O(n^2)的排序算法之一。 比如0到100,第一次分组间隔...原创 2020-07-24 11:31:18 · 150 阅读 · 0 评论 -
二叉树中找出2个节点的最近公共祖先
给定二叉树和两个节点n1和n2,编写程序以找到他们的最近公共祖先。在做这个之前, 有些东西需要提前问清楚, 二叉树是不是二叉搜索树, 如果是二叉搜索树, 那就好处理多了. 在保证2个节点都属于此二叉树的情况下.由于二叉搜索树是排序过的, 位于左子树的结点都比父结点小, 而位于右子树的结点都比父结点大, node.data>node.left.data &&node.data>node.right.data , 我们只需要从树的根结点开始和两个输入的结点进行比较。如..原创 2020-07-18 12:13:28 · 2162 阅读 · 0 评论 -
判断扑克牌能否组成顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。组成顺子有一些条件是必须要满足的,1.除了大小王之外, 其他牌不能重复2.除了大小王之外, 最大值-最小值==4(没有零), 最大值-最小值==3或4(有1个零), 最大值-最小值==2或3或4(有2个零) , 但是看到了别人的优化版, 这几种情况可以统一为最大值-最小值<5即可, 不需要看0个数量tip : 使用se...原创 2020-07-16 11:53:58 · 2303 阅读 · 0 评论 -
求n个骰子的点数和
把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入骰子个数n,求所有s出现的概率。最直接的方法, 把所有的情况都列出来, 然后统计出现和的次数, 用次数/6^n就是对应的概率.用一个数组装所有的可能, 递归调用装满数组, 当数组的大小等于n的时候说明装满了, 对数组计算一次和, 并存入到字典. 然后在处理字典, 用value/6^n 就是对应的概率了.- (void)viewDidLoad { [super viewDidLoad]; [self proba..原创 2020-07-15 18:44:44 · 1545 阅读 · 0 评论 -
排序数组求和为s的组合
输入一个递增排序的数组和一个数字s,在数组中査找两个数,使得它们的和正好是s。例如,输入数组{1、2、4、7、11、15}和数字15。由于4+11=15,因此输出4和11。很多人都能立即想到O(n^2)的方法,也就是先在数组中固定一个数字,再依次判断数组中其余的n-1个数字与它的和是不是等于s。但是这样是不会让面试官满意的.我们试着想更好的方法, 在数组中选择头部和尾部的2个数字,如果它们的和等于输入的s,我们就找到了要找的两个数字。如果和小于s呢?我们希望两个数字的和再大一点。由于数组已经排.原创 2020-07-14 11:11:01 · 984 阅读 · 0 评论