
算法
-Billy
这个作者很懒,什么都没留下…
展开
-
有效的完全平方数
public boolean isPerfectSquare(int num) { int i = 1, j=num; while (i <=j) { int mid = (i + j)/2; if (mid == (num * 1.0/mid)) // 防止乘法溢出 ...原创 2019-03-08 11:39:20 · 198 阅读 · 0 评论 -
旅行售货员问题
某售货员要到若干城市去推销商品,已知各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。解题思路:先对所有城市全排列 ,再计算每条路径的花费,取最小值。 int MinCost = Integer.MAX_VALUE; // 花费 /** * @param route 路线花费 * @param city 城市编号 ...原创 2019-02-18 19:09:09 · 1572 阅读 · 1 评论 -
子集和问题
子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得子集S1和等于c。 设计一个回溯法来求解该问题。解题思路:对于该集合的每一个子集,若元素和为正整数c,则将该子集放入解集中,最后返回解集即可。 /** * @param list 存放所有满足要求的解 * @para...原创 2019-02-18 16:00:15 · 1032 阅读 · 0 评论 -
. 重构字符串
解题思路:1.先统计每个字母出现的次数 2. 按照次数由高到底排序 3. 先取最高,假设是a 4. 然后从次高中取一个,组合起来,然后重新统计次数然后回到3。 public String reorganizeString(String S) { int n = S.length(); // 键:字符,值:下标 HashMap<Character, I...原创 2019-02-23 17:23:08 · 413 阅读 · 0 评论 -
划分字母区间
解题思路:先用一个map统计出,每一个字符的最后出现位置。遍历字符串S,对于每一个字符,判断它的最后出现位置是否包含在 前面的字符最后出现位置内,如果不包含,就更新最后出现位置。每次达到最后出现位置时,就计算片段的长度,直到遍历结束为止。 public List<Integer> partitionLabels(String S) { ArrayList&l...原创 2019-02-23 15:39:28 · 814 阅读 · 0 评论 -
回溯法思想
回溯法有“通用的解题法”之称。可以用来系统地搜索一个问题的所有解或任一解。回溯法在问题的解空间树中,按照深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按照深度优先策略搜索。回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索...原创 2019-02-18 12:39:40 · 737 阅读 · 0 评论 -
优势洗牌
解题思路:先对数组A排序, 对于B中的每一个元素i,在A中遍历,找到最小的大于B[j]的元素,如果找不到,就用A中最小的未使用的元素来对应。(有点像田忌赛马) public int[] advantageCount(int[] A, int[] B) { // 按照元素大小对A排序 Arrays.sort(A); // 判...原创 2019-02-23 14:36:11 · 247 阅读 · 0 评论 -
买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这...原创 2019-02-12 17:08:35 · 143 阅读 · 0 评论 -
跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。 public boolean canJump(int[] nums) { // 长度为1 if ...原创 2019-02-12 16:14:28 · 457 阅读 · 0 评论 -
目标和
给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。1、常规思路 对于数组中的每一个数,它的符号只有两种选择,一种是取正,一种是取负,根据这两种策略,计算结果。 int ncount =...原创 2019-02-12 12:10:56 · 1278 阅读 · 1 评论 -
单调递增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)示例 1:输入: N = 10输出: 91、暴力法(超时) public int monotoneIncreasingDigits(int N) ...原创 2019-02-22 17:46:23 · 1670 阅读 · 0 评论 -
最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。1、暴力法对于每一个子串,判断是否是回文字符串,找出长度最大者即可。 public String longestPalindrome(String s) { /...原创 2019-02-22 16:27:14 · 134 阅读 · 0 评论 -
救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。示例 1:输入:people = [3,2,2,1], limit = 3输出:3解释:3 艘船分别载 (1, 2), (2) 和 (3)解题思路:先按照人的体...原创 2019-02-22 15:58:53 · 566 阅读 · 0 评论 -
令牌放置
你的初始能量为 P,初始分数为 0,只有一包令牌。令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。 如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。在使用任意数量的令牌后,返回我们可以得到的最大...原创 2019-02-17 15:43:55 · 317 阅读 · 0 评论 -
使括号有效的最少添加
给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是有效的:它是一个空字符串,或者 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。给定一个括号字符串,返回...原创 2019-02-17 15:12:47 · 494 阅读 · 0 评论 -
删列造序
给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符。 所余下的字符串行从上往下读形成列。比如,有 A = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 A 为["bef", "vyz"], A 的列分别为["b","v"], ["e&q原创 2019-02-17 13:50:33 · 221 阅读 · 0 评论 -
最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: ")()())"输出: 4 解释: 最长有效括号子串为 "()()" public int longestValidParentheses(String s) { // 先对字符串s进行判断 if (s == null || s.lengt...原创 2019-02-22 15:10:18 · 460 阅读 · 0 评论 -
一和零
该题我尝试使用暴力方法来求解,始终测试不通过,而后将代码改为自底向上的动态规划算法,才测试通过。1、暴力算法(测试不通过) 暴力算法有缺陷 public int findMaxForm(String[] strs, int m, int n) { int len = strs.length; int maxSum = 0; // 最大数量 int zero...原创 2019-02-10 20:25:49 · 446 阅读 · 0 评论 -
不含 AAA 或 BBB 的字符串
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。在此过程之后,我们得到一些数组 B。返回 B 的最大值和 B 的最小值之间可能存在的最小差值。示例 1:输入:A = [1], K = 0输出:0解释:B = [1]思路1:先将字符串全部置为“aaaa...” 或 "bbbbb..." ,再查找...原创 2019-02-13 14:56:59 · 444 阅读 · 0 评论 -
加油站
解题思路:先计算从每一个站点的油量与前往下一个站点的油量之间的差, 判断是否可以从改点通往其他站点。再对每一个有可能的站点,计算环路的耗油量,如果跑完全程耗油量不小于0,则能行驶一周。 public int canCompleteCircuit(int[] gas, int[] cost) { int[] costGas = new int[gas.length]; ...原创 2019-02-28 15:16:31 · 189 阅读 · 0 评论 -
根据身高重建队列
解题思路:1、先按照排名进行排序,排名小的在前,若名次相同,身高矮的在前面。 2、然后按照身高大小,逐一与前面的人比较,若小于前面的人的身高,则计数器加1,当计数器等于名次时,就逐步移动数组元素,将其放到合适的位置上。 public int[][] reconstructQueue(int[][] people) { int n = people.l...原创 2019-02-24 16:44:59 · 650 阅读 · 0 评论 -
寻找比目标字母大的最小字母
public char nextGreatestLetter(char[] letters, char target) { // 先判断最后一个字母是否比目标字母大 if (letters[letters.length-1] <= target) return letters[0]; int low = 0, high = letters.length-1...原创 2019-03-08 11:29:45 · 530 阅读 · 0 评论 -
寻找重复数
解题思路:二分法。在区间[1, n]中搜索,首先求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数小于等于mid,则说明重复值在[mid+1, n]之间,反之,重复值应在[1, mid-1]之间,然后依次类推,直到搜索完成,此时的right就是我们要求的重复值。 public int findDuplicate(int[] nums) ...原创 2019-03-04 21:05:20 · 628 阅读 · 0 评论 -
两个数组的交集
二分法: 先排序,对两个数组做归并运算,使用set来去重。 public int[] intersection(int[] nums1, int[] nums2) { int i = 0, j = 0, k = 0; // 排序 Arrays.sort(nums1); Arrays.sort(nums2); HashSet<Integer> ...原创 2019-03-04 20:41:38 · 360 阅读 · 0 评论 -
反转字符串中的元音字母
public String reverseVowels(String s) { int i = 0; int j = s.length()-1; char c; char[] ss = s.toCharArray(); while (i < j) { while (i < j && containsVowels(ss[i])...原创 2019-03-04 20:16:52 · 486 阅读 · 0 评论 -
区间列表的交集
解题思路:先要考虑两个集合存在交集的情况。通过分析,可以知道当a.s >= b.s时,交集为[a.s, min(a.e, b.e)],同理当b.s >= a.s时,交集为[b.s, min(a.e, b.e)]。 public Interval[] intervalIntersection(Interval[] A, Interval[] B) { Arra...原创 2019-03-07 12:15:09 · 1010 阅读 · 0 评论 -
盛最多水的容器
解题思路:两个指针,一前一后,分别指向第一个元素和最后一个元素,计算此时容纳水的容量,根据两边的高度调整移动方向,指针向高的那边移动(贪心性质)两个指针相撞时就结束。 public int maxArea(int[] height) { int i = 0; int j = height.length-1; int maxWater = 0; whil...原创 2019-03-04 16:38:40 · 188 阅读 · 0 评论 -
两数之和II
public int[] twoSum(int[] numbers, int target) { int i = 0, j = numbers.length-1; int[] ret = new int[2]; while (i < j) { while (target > 0 && numbers[j] > target) ...原创 2019-03-06 12:09:07 · 203 阅读 · 0 评论 -
删除排序数组中的重复项
public int removeDuplicates(int[] nums) { int j = 1; // 慢指针 for (int i=1; i<nums.length; i++) { if (nums[i] != nums[i-1]) { nums[j++] = nums[i]; } } return j; }...原创 2019-03-06 11:38:18 · 157 阅读 · 0 评论 -
有序数组的平方
public int[] sortedSquares(int[] A) { int i = 0, j = A.length-1; int k = A.length-1; int[] tmp = new int[A.length]; while (i <= j) { if (A[i] * A[i] <= A[j] * A[j]) { ...原创 2019-03-06 11:12:03 · 250 阅读 · 0 评论 -
编辑距离
int[][] memo = null; // 备忘录 int solve(String word1, String word2, int c1, int c2) { int a, b, c ; int n1 = word1.length(); int n2 = word2.length(); if (c1 == n1 && c2 == n2...原创 2019-02-26 17:37:56 · 193 阅读 · 0 评论 -
租用游艇问题
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。解题思路:f(i, n) = min(f(i,j ) +f(j, k) + ..+f(k,n)) 。public class RentYa...原创 2019-02-26 15:43:03 · 405 阅读 · 0 评论 -
移除元素
双指针:两个指针分别指向首尾,遍历头指针,遇到等于val时,遍历尾指针,找到不等于val的值,进行交换,两指针相撞时,结束。 public int removeElement(int[] nums, int val) { int i = 0, j = nums.length-1; // 将等于val的数移动到数组右边 while (i <= j) { ...原创 2019-03-05 13:14:16 · 184 阅读 · 0 评论 -
最低票价
int[][] memo = null; // 备忘录 int r(int idx, int[] days, int[] costs, int deadLine) { int a, b, c, min; if (idx == days.length) return 0; // 有效期超过最后一天 if (deadLine >= days[days...原创 2019-03-01 18:48:53 · 347 阅读 · 0 评论 -
完全平方数
解题思路:该题目与Coin Change很相似,先找出到n为止的所有的完全平方数,然后暴力法进行搜索。当然,可以继续优化为动态规划。 int[][] memo = null; // 备忘录 public int sovle(int n, int [] squares, int idx) { if (n == 0) // 找到一种组合 return 0; ...原创 2019-03-01 15:28:37 · 1176 阅读 · 0 评论 -
翻转矩阵后的得分
解题思路:先判断每一行的第一个元素,是否是0,如果是,就翻转该行;判断第2列到最后一列中,每列0的个数是否大于1的个数,如果是,就翻转该列;之后按照二进制数的解释进行计算。 public int matrixScore(int[][] A) { if (A == null || A.length == 0) return 0; int rows = A....原创 2019-03-01 14:53:39 · 200 阅读 · 0 评论 -
无重叠区间
解题思路:该题目类似于活动安排问题,先按照结束时间的长短进行排序,结束时间短的排在前面,在根据后一个活动的开始时间要比前一个活动的结束时间要晚的原则,从前向后筛选即可。 public int eraseOverlapIntervals(Interval[] intervals) { int n = intervals.length; int ncount = 0; ...原创 2019-02-25 16:54:41 · 216 阅读 · 0 评论 -
判断子序列
双指针法 public boolean isSubsequence(String s, String t) { // s为空串 if (s.isEmpty()) return true; int i = 0, j = 0; while (i < s.length() && j < t.length()) { ...原创 2019-02-25 15:34:12 · 872 阅读 · 0 评论 -
整数分解
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。1、回溯法(对于每...原创 2019-02-21 18:06:39 · 1071 阅读 · 0 评论 -
下降路径最小和
给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。 public int minFallingPathSum(int[][] A) { int m = A.length; // 行数 int n = A[0].length; // 列数 i...原创 2019-02-08 23:16:09 · 328 阅读 · 0 评论