随笔分类 - 算法
摘要:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 leetcode 解题思路:对数组进行重新排序,排序规则是,分别将两个数值放在前后位置,然后比较作为返回。 class Solution { public String minNumber(int[] n
阅读全文
摘要:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。 请写一个函数,求任意第n位对应的数字。 leetcode 解体思路:找规律。 相同位数的数字数量的递增关系是10, 90, 900, 9
阅读全文
摘要:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 leetcode 解题思路:依次遍历每一个位的情况。即统计,小于当前数字的数中,每一个位为1的数量。 当前位是0:则不存小于去掉高位,当前位
阅读全文
摘要:假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调用该方法; 实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个
阅读全文
摘要:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 leetcode 解题思路:中序遍历链表,保留上一个节点,每次遍历到一个节点的时候,将上一个节点right指向当前节点,再将当前节点的left指向上个节点。 第一次枚举到left的
阅读全文
摘要:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 链接:leetcode 解题思路:不同于简单列表的复制,这个多了一个随机指针。如果是简单列表,直接构造一个新
阅读全文
摘要:稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。 leetcode 解题思路:主要还是利用二分的思想,因为排除空格,这个数组还是有序的。但是需要在搜索的时候,跳过空格。 怎么跳呢?首先需要保证二分的两段元素不是空格,然后保证枚举的中间元素不能是空格。
阅读全文
摘要:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 链接: leetcode. 解题思路:从后往前遍历,检测到第一个如果前一元素小于当前元素,那就说明下
阅读全文
摘要:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 链接: leetcode. 解题思路:暴力的方法就是一个一个乘,时间是O(n)的。快速幂的核心思想就是,用位的方式,快速相乘。幂的本质是
阅读全文
摘要:班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知
阅读全文
摘要:在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; (3) 盘子只
阅读全文
摘要:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 链接: link. 解题思路:利用单调栈的思想。 从左向右遍历,栈中不断存储左侧的柱子,而且是单调下降的。当后者的柱子长度大于前者的,就会形成一个蓄水区域,当一个蓄水区域形成之后,短的柱子就没有用了,
阅读全文
摘要:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。 链接: leetcode. 解题思
阅读全文
摘要:二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字不在0和1之间,或者无法精确地用32位以内的二进制表示,则打印“ERROR”。 链接: leetcode. 二进制小数转化为十进制 十进制小数转化为二进制 class Solution
阅读全文
摘要:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 输入: [7,5,6,4] 输出: 5 链接: leetcode. 解题思路:利用归并排序的思想。在归并排序中,需要通过两个指针比较前后两个元素的大小,当前元素大于后元素时,
阅读全文
摘要:栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。 leetcode. 思路:利用两个栈,分别实现大顶堆和小顶堆,以
阅读全文
摘要:思路:利用快慢指针思想,快指针每次走两步,慢指针走一步。当快指针走到底的时候,满指针指向的就是链表的中间节点。需要注意的是,当链表长度为偶数位的时候,则慢指针指向的是中间偏右的节点,奇数的时候,指向的是中间节点。 if(head == null || head.next == null) retur
阅读全文
摘要:给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。 然而,两个相同种类的任务之间必须有长度为 n
阅读全文
摘要:给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 你找到的子数组应是最短的,请输出它的长度。 输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都
阅读全文
摘要:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 链接: leetcode. 解题思路: 第一反应回想到双指针的算法,但是数组中的元素有可能为负数,所以
阅读全文

浙公网安备 33010602011771号