
algrithm
Rainly2000
硕士在读,口头禅是 业精于勤荒于嬉,行成于思毁于随,人生有着无限的可能不要轻易给自己设限
展开
-
算法专题: 找出数字连续的最长序列(不要求序列元素在原数组中连续)
遍历数组中的每个数 x,如果 x-1 不在哈希表中,说明 x 是一个连续序列的开头,我们可以从 x 开始不断向后找 x+1,直到找不到为止,此时记录连续序列的长度,并更新哈希表中左右两端数的长度。首先,对于一个数 x,如果存在 x-1,那么说明 x 不可能是连续序列的开头,因为在这种情况下会选择 x-1 作为开头。解释: 最长数字连续序列是 [1, 2, 3, 4]。输入: nums = [0,3,7,2,5,8,4,6,0,1]输入: nums = [100,4,200,1,3,2]原创 2023-03-11 18:08:33 · 768 阅读 · 0 评论 -
基于递归求解全排列组合
【代码】基于递归求解全排列组合。原创 2022-10-06 18:12:59 · 115 阅读 · 0 评论 -
每日一算:java基于动态规划求解最长回文子串详解
动态规划、回文子串原创 2022-06-05 17:47:45 · 337 阅读 · 0 评论 -
java 二分法查找二维数组最右区间
question: 给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j ,并满足 startj >= endi ,且 startj 最小化 。返回一个由每个区间 i 的 右侧区间 在 intervals 中对应下标组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。code:public class FindRightInter原创 2022-05-25 20:05:30 · 93 阅读 · 0 评论 -
算法:基于java实现一个能够返回随机数索引的小程序
功能描述:给你一个可能含有 重复元素 的整数数组 nums ,请你随机输出给定的目标数字 target 的索引。你可以假设给定的数字一定存在于数组中。具体的代码实现:class Solution { Map<Integer,List<Integer>> map ; Random random ; public Solution(int[] nums) { map = new HashMap<>() ; ra原创 2022-04-25 23:29:36 · 405 阅读 · 0 评论 -
一道美团算法题,据说Don Knuth花了24小时才解答出来
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有一个重复的整数,这个数可能出现两次或者多次,返回这个重复的数。题目要求我们必须不修改数组 nums ,并且只用常量级 O(1) 的额外空间。一眼扫过去,题目很好理解,思路也很容易理清,最直观的想法就是使用哈希表不就能马上查找出重复的整数么?但再看一眼条件,只能用常量级 O(1) 的额外空间,于是哈希表的思路走不通。一般的解法是采取二分查找的思路来原创 2022-04-10 23:39:26 · 422 阅读 · 0 评论 -
为什么数组的下标是从0开始而不是从1开始?
一、数组下标从0开始的原因在回答这个问题之前我们首先要明确一点那就是对于数组元素的访问在操作系统层其实就是对特定内存偏移量的数据的访问,换而言之即如果想要访问一个数组的某一个元素的值那么首先就要计算它的地址偏移量 ,其大概的公式为:a[k]_adress = base_address + k*type_size ;,倘若数组下标是从1开始那么地址计算公式即会转变为:a[k]_adress = base_address + (k-1)*type_size ;这对于CPU来说多了一次减法操作,对于原创 2022-04-05 23:05:11 · 7567 阅读 · 0 评论 -
数据结构如何速成
1、数组2、栈3、队列4、链表5、树6、散列表7、堆8、图数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。int[] data = new int[100];data[0] = 1;COPY优点:1、按照索引查询元素速度快2、按照索引遍历数组方便缺点:1、数组的大小原创 2022-03-27 22:45:03 · 813 阅读 · 0 评论 -
Knuth-Morris-Pratt 算法(KMP算法)
Knuth-Morris-Pratt 算法,简称 \text{KMP}KMP 算法,由 \text{Donald Knuth}Donald Knuth、\text{James H. Morris}James H. Morris 和 \text{Vaughan Pratt}Vaughan Pratt 三人于 19771977 年联合发表。\text{Knuth-Morris-Pratt}Knuth-Morris-Pratt 算法的核心为前缀函数,记作 \pi(i)π(i),其定义如下:对于长度为 mm 的原创 2022-03-06 23:08:05 · 869 阅读 · 0 评论 -
基于java实现一个 漏斗限流算法
以下代码实现了 漏斗的限流,核心是makespace 方法,代码如下:public class FunnelRateLimiter { static class Funnel { // 漏斗容量 int capacity ; // 限流速率 float leakingRate ; // 剩余容量 int leftQuota ; // 时间 long leakTs ;原创 2022-03-05 14:10:00 · 1068 阅读 · 0 评论 -
基于分治法求字符串数组的最长公共前缀
采用的是分而治之的算法思想:代码如下: class Solution { public String longestCommonPrefix(String[] strs) { if(strs.length == 0 || strs == null){ return ""; }else{ return longestCommonPrefix(strs,0,strs.length-1) ; } }原创 2022-03-03 23:07:06 · 103 阅读 · 0 评论 -
每日一算: 对多个整数区间进行合并(基于排序去实现)
将多个整数区间重叠的部分合并起来核心代码如下:public int[][] merge(int[][] intervals) { if (intervals.length == 0) { return new int[0][2]; } Arrays.sort(intervals, new Comparator<int[]>() { public int compare(int[] interval原创 2022-02-28 22:40:22 · 129 阅读 · 0 评论 -
每日一算:在递增序列中求出和为s的两个数字(Java解法)
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。采用双指针解法,代码如下:public int[] twoSum(int[] nums, int target) { int left = 0,right = nums.length -1 ; int[] ret = new int[2] ; while(left < right){ int sum =原创 2022-02-27 23:36:21 · 223 阅读 · 0 评论