![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 51
一直不懂
笔记
展开
-
算法:小于n的最大数
在这个遍历过程中,注意后一位如果比nums数组中的最小值还要小,那么就应该这一位要找寻的最大值再减一。首先讲nums数组进行排序,注意下需要判断我们要寻找的最大值,如果n中的每一位数都比nums数组最小值都要小,那么我们要找寻的最大数长度为原来的n长度减一。题目要求:给定一个数组例如nums=[2,3,4,5],n=2345,求使用nums中的数字,组成一个不大于N的最大的数字。这个题目在网上有很多解答,但是大部分解答都有问题,没法完全的覆盖所有的case,因此在这里记录下我的解答。转载 2023-01-29 11:27:10 · 1977 阅读 · 2 评论 -
【排序】图解桶排序
一、思想一句话总结:划分多个范围相同的区间,每个子区间自排序,最后合并。桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。二、图解过程三、核心代码public static void bucketSort(int[] arr){ /转载 2022-03-20 15:10:25 · 310 阅读 · 0 评论 -
一文弄懂计数排序算法
01 计数排序算法概念计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N)。02 基础版算法步骤第一步:找出原数组中元素值最大的,记为max。第二步:创建一个新数组count,其长度是max加1,其元素默认值都为0。第三步:遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。第四步:创建结果数组result,起始索引index。第五步:遍历count数组,找出其转载 2022-03-20 15:07:25 · 691 阅读 · 0 评论 -
最长的回文子串
题目给你一个字符串 s,找到 s 中最长的回文子串。示例示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”实现暴力解法class Solution { public static void main(String[] args) { String res = longe原创 2021-03-11 23:40:21 · 279 阅读 · 0 评论 -
生成N对括号所有可能的有效括号组合
题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]思路核心是必须要先有一个左括号才能给字符串添加括号,且无论何时右括号的个数一定要小于等于左括号的个数。实现import java.util.ArrayList;import java.util.List;class原创 2021-03-11 22:28:00 · 2437 阅读 · 0 评论 -
数字金额转中文大写金额
public static String transAmount2Chinese(long amount) { //每4位一组,每一组多一位分隔符splits String[] unit = {"", "拾", "佰", "仟"}; //个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿 、兆、十兆、百兆、千兆、 //京、十京、百京、千京、垓、十垓、百垓、千垓、秭、十秭、百秭、千秭、穰、十穰、百穰、千穰、沟、十沟、百沟... String[] splits =原创 2021-02-24 00:45:27 · 1754 阅读 · 0 评论 -
马踏棋盘(回溯算法)
题目在n*m的棋盘中,马只能走"日"字。马从位置(x,y)出发,把棋盘的每一格都走一次且只走一次。找出所有路径。分析马是在棋盘的点上行走的,所以这里的棋盘是指行有N条边、列有M条边。而一个马在不出边界的情况下有8个方向可以行走(走"日"字),如当前坐标为(x,y),则行走后的坐标可以为: (x+1, y+2) (x+1, y-2) (x+2, ...转载 2019-09-16 23:36:51 · 2332 阅读 · 0 评论 -
随机生成和为S的N个正整数——投影法
以生成和为20的4个数为例,可以先生成随机生成0到20之间的三个数字再排序,假设得到了4,7,18。然后在X-Y数轴上画出这三个数,如下图:然后将这些数值投影到Y轴上,可得下图:由图很容易看出AB,BC,CD,DE这四段的长度和肯定为20。因此AB,BC,CD,DE这四段的长度即和为20的4个数,这4个数分别为4,3,11,2。这种方法只要随机生成N - 1个小于S的不同数字,...转载 2019-09-08 01:55:01 · 180 阅读 · 0 评论 -
找出数组中只出现1次的两个数字
题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。这个题目在之前的《位操作基础篇之位操作全面总结》中的“位操作趣味应用”中就已经给出解答了。根据异或运算的特点,直接异或一次就可以找出这个数字。现在数组中有两个数字只出现1次,直接异...转载 2019-09-08 01:49:44 · 151 阅读 · 0 评论 -
在数组中找重复元素——基数排序法
题目:一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。这个题目要求用O(n)的时间复杂度,这意味着只能遍历数组一次。同时还要寻找重复元素,很容易想到建立哈希表来完成,遍历数组时将每个元素映射到哈希表中,如果哈希表中已经存在这个元素则说明这就是个重复元素。因此直接使用HashSetet可以方便的在O(n)时间内完成...转载 2019-09-08 01:45:41 · 505 阅读 · 0 评论 -
在数组中找重复元素——符号位标志法
题目:一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。int Repeat(int *a, int n){ for(int i = 0; i < n; i++) { if(a[i] > 0) //判断条件 { if(a[ a[...转载 2019-09-08 01:44:49 · 398 阅读 · 0 评论 -
求逆序数对
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。计算数列的逆序数对个数最简单的方便就最从前向后依次统计每个数字与它后面的数字是否能组成逆序数对。代码如下...转载 2019-09-08 01:25:00 · 826 阅读 · 0 评论 -
位操作基础篇
在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。因此本文将对位操作进行如下方面总结:一.位操作基础,用一张表描述位操作符的应用规则并详细解释。二....转载 2019-09-08 01:12:58 · 837 阅读 · 0 评论 -
排序算法
1、冒泡排序实现public class BubbleSort implements Sort { /** * 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 * 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 * 3.N=N-1,如果N不为0就重复前面二步,否则排序完...原创 2019-09-08 00:24:58 · 343 阅读 · 0 评论