
算法
LuciferCoder
这个作者很懒,什么都没留下…
展开
-
信号量(Semaphore)-你真的了解吗?
什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问原创 2020-12-06 20:13:20 · 8005 阅读 · 0 评论 -
递归的内涵与经典应用
一 引子 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。 递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若原创 2020-11-25 19:18:57 · 418 阅读 · 0 评论 -
学通java位运算,一篇就够!
什么是位运算下面以一张图来演示一下位运算规则位运算快在哪里?位运算真的快了吗?下面以左移一位与乘以2来实验一下public void multiply2_1() { int i = 1; i = i << 1;}public void multiply2_2() { int i = 1; i *= 2;}优化分为两部分,一个是编译器优化,另一个是处理器优化编译好之后,用javap -c来看下编译好的class文件,字节码是:public原创 2020-11-07 09:58:52 · 214 阅读 · 0 评论 -
1024节,又是动归的2天。。
视频拼接你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回原创 2020-10-25 09:47:50 · 144 阅读 · 0 评论 -
Leetcode-重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.class Solution { public vo原创 2020-10-21 13:01:44 · 453 阅读 · 0 评论 -
Leetcode-长按键入
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。示例 1:输入:name = “alex”, typed = “aaleex”输出:true解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。示例 2:输入:name = “saeed”, typed = “ssaaedd”输出:false解释:‘e原创 2020-10-21 12:59:42 · 89 阅读 · 0 评论 -
多数元素-多种解法
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2暴力简单的暴力方法(即枚举数组中的每个元素,再遍历一遍数组统计其出现次数,时间复杂度为 o(N2)) 的算法我们需要找出时间复杂度小于o(N2)) 的优秀做法哈希思路我们知道出现次数最多的元素大于 n/2次,所以可以用原创 2020-10-17 10:43:37 · 2438 阅读 · 0 评论 -
Leetcode-39. 组合总和-回溯法
可行解问题,优先考虑回溯法给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5],原创 2020-10-10 18:16:59 · 185 阅读 · 0 评论 -
Leetcode-34. 在排序数组中查找元素的第一个和最后一个位置
见到有序,首先想到二分法,这道题和博主上一篇算法都是二分法,大家可以一起看Leetcode-33. 搜索旋转排序数组给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10],原创 2020-10-07 21:05:39 · 315 阅读 · 0 评论 -
Leetcode-33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,6,7,0,1,2], target =原创 2020-10-06 20:23:09 · 101 阅读 · 0 评论 -
Leetcode-31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1class Solution { public void nextPermutation(int[] nums) { if(nums == nul原创 2020-10-04 11:18:14 · 78 阅读 · 0 评论 -
回溯算法与深度优先算法
搜索与回溯是计算机竞赛中常用的算法,当很多问题无法通过计算法则来求解时,便可以利用搜索和回溯的技术来求解。回溯是搜索算法中的一种控制策略,它的基本思想是:为了求得问题的解,先选择一种可能的情况向前探索,如果在探索过程中发现原来的选择是错误的,就退回一步重新选择,如此反复进行,直到穷举出所有情况,可以证明该问题无解。我相信很多人小时候都玩过“走迷宫”这样一个游戏:进入迷宫后,先随意选择一个可以走的地方前进,如果碰到死路,则说明前方无路可走,这时,如果周围还有没有路可以走,就继续选择一条路前进,否则就往后退原创 2020-10-03 10:34:06 · 982 阅读 · 0 评论 -
Leetcode-29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333…) = truncate(3)原创 2020-10-03 09:54:39 · 97 阅读 · 0 评论 -
贪心算法与动态规划算法
动态规划和贪心算法都是一种递推算法,均由局部最优解来推导全局最优解 。贪心算法不断贪心地选取当前最优策略的算法设计方法。1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。动态规划算法1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解2.动态规划的关键是状态转移方程,即如何由以求出的原创 2020-09-23 11:43:55 · 2067 阅读 · 2 评论