算法
菜鸟A过的算法
wzp、、、
这个作者很懒,什么都没留下…
展开
-
跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 代码: public class Solution { public int JumpFloor(int target) { int a = 1, b = 1; for(int i = 1; i < target; i++) { a = a + b; b = a - b;原创 2020-07-18 21:13:20 · 83 阅读 · 0 评论 -
变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 代码: public class Solution { public int JumpFloorII(int target) { if (target == 0 || target == 1) { return 1; } int a = 1; for(int i = 2; i <= ta原创 2020-07-18 20:32:13 · 61 阅读 · 0 评论 -
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 代码: public class Solution { public int Add(int num1,int num2) { int res = 0; int carry = 0; do { res = num1 ^ num2; carry = (num1 & num2) << 1;原创 2020-07-14 21:56:19 · 88 阅读 · 0 评论 -
leetcode #452 射击气球
题目描述 要是一箭射击更多的气球,最好的情况就是这些气球都有一个公共的坐标区间,所以我们可以先将这些气球按左端点进行排序,然后开始遍历,如果此时气球的左端点在当前区间内,则更新当前区间的左端点为气球的左端点,再比较气球的右端点和区间的右端点,如果区间的右端点比气球的右端点大,则更新区间的右端点为当前气球的右端点,从而缩小区间,找出更多的公共区间。如果一开始气球的左端点不在当前区间内,则射箭的数量+1,同时更新区间为气球的左右端点。 代码 class Solution { public int fi原创 2020-05-25 16:20:56 · 409 阅读 · 0 评论 -
leetcode #45 跳跃游戏2
题目描述 其实这道题和55题思路差不多,也是用贪心算法,这道题的前提是总能到达最后一个位置,如果要用最少的跳数到达末尾,那不用跳是最好的情况,只有当前位置超过可到达的最远位置时,这时表示必须要有跳了,跳数加1,然后从当前位置跳动下一跳能到达最远位置的位置。 代码 class Solution { public int jump(int[] nums) { if(nums.length < 2) {//数组长度小于2,说明没有值或只有一个值,不用跳 re原创 2020-05-25 15:26:53 · 138 阅读 · 0 评论 -
leetcode #55 跳跃游戏
题目描述: 思路:这道题用贪心算法,算出在每一个位置上可跳到的最远位置,如果在这个最远位置里,已经跳到了数组末尾,即表示可以到达。 代码: class Solution { public boolean canJump(int[] nums) { int[] index = new int[nums.length];//该数组表示在第i个位置上可以到达的最远位置 for(int i = 0; i < nums.length; i++) {原创 2020-05-18 17:09:56 · 132 阅读 · 0 评论 -
leetcode #402 移掉K位数字
这道题采用贪心+栈的方法求解 class Solution { public String removeKdigits(String num, int k) { Stack stack = new Stack(); StringBuilder result = new StringBuilder(); //存储最终结果 for(int i ...原创 2020-05-05 09:57:33 · 87 阅读 · 0 评论 -
leetcode #455 分发饼干
思路:利用贪心算法,先将两个数组进行排序,循环遍历这两个数组,直到有一个数组已被遍历完,此时返回孩子的个数child即为答案。 class Solution { public int findContentChildren(int[] g, int[] s) { int child = 0; int cookie = 0; Arrays.s...原创 2020-05-04 18:53:47 · 87 阅读 · 0 评论 -
leetcode #120 三角形最小路径和
题目描述: 该题是leetcode的中等题,一开始想到的是递归回溯,AC之后时间复杂度达不到要求,改为动态规划求解。思路:可以从上到下递推,也可以从下到上递推,这里用第二种,事实上也是第二种比较容易思考:求dp[i][j]时,每次比较这个数下面的两个数dp[i + 1][j],dp[i + 1][j + 1]的大小,选择小的一个加上本身就是当前的这个位置的最优解,这样就求得了状态转移方程。 代码...原创 2020-04-20 19:16:37 · 93 阅读 · 0 评论 -
leetcode #53 最大子序和
题目描述: 思路:这道题要有基础的动态规划知识才能get到思路,要求n个数的数组的最大字段和,转换为分别求以第1个,第2个……数字结尾的最大字段和,再找出n个结果中最大的,即为结果。临界值dp[0]为数组的第一个数字,如果dp[i - 1] > 0 , dp[i]=dp[i - 1] + nums[i];否则: dp[i] = nums[i]。 代码: class Solution { ...原创 2020-04-14 14:05:24 · 77 阅读 · 0 评论 -
leetcode #198 打家劫舍
题目描述: 思路:这道是动态规划的题,边界值为dp[0]和dp[1],求第i个房屋的最优解转化为求第i-1个房屋的最优解和第i-2个房屋的最优解加上第i个房屋的值,这两个最优解的最大值即为第i个房屋的最优解。 代码: class Solution { public int rob(int[] nums) { if(nums.length == 0){ //数组长度为0的情...原创 2020-04-14 11:23:29 · 100 阅读 · 0 评论 -
leetcode #70 爬楼梯
题目描述: 思路:这道题是动态规划,有点类似斐波那契数列,但如果只是单纯递归回溯的话会超时,需要进行优化。仔细分析一下,发现第i阶的走法等于第i-2阶的走法加上第i-1阶走法的数量。 代码: class Solution { public int climbStairs(int n) { int[] dp = new int[n + 3]; //这是为了不用判断n=0的...原创 2020-04-14 10:38:42 · 103 阅读 · 0 评论 -
leetcode #200 岛屿数量
题目描述: 该题是leetcode的中等题,首先想到的是搜索,深度优先搜索和广度优先搜索都行。这里用的是深搜。思路:创建一个二维数组来标记是否已经搜过,遍历原始数组,如果是陆地’1’且没有被搜过,就开始深搜;深搜完后,岛屿数量加1即可。 代码如下: class Solution { //表示深度搜索的上下左右四个方向 static int[] dx = {-1, 1, 0, 0}...原创 2020-04-13 22:42:36 · 107 阅读 · 0 评论 -
leetcode #23 合并k个有序链表
示例: 该题是leetcode的困难题,方案一是和21题一样,先合并两个链表,合并后的链表再和下个链表继续合并,循环下去,这种方案的时间复杂度为O(k^2*n),k表示链表的个数,n表示每个链表的平均节点数。方案一在leetcode上提交不过,即使答案正确。方案二:采用分治的方法,对k个链表进行分治,两两进行合并,时间复杂度O(knlogk),提交通过。 方案二代码: class Solutio...原创 2020-04-13 20:29:22 · 122 阅读 · 0 评论 -
leetcode #21合并两个有序链表
示例: 思路:创建一个头节点head和一个指向该节点的标记节点pre,遍历链表,比较两个节点val的大小,标记节点指向val小的节点,直到一个链表遍历完。最后如果链表1不为空,则pre指向l1;反之亦然。 代码如下: class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { Lis...原创 2020-04-13 19:44:39 · 72 阅读 · 0 评论 -
leetcode #138 复制带随机指针的链表
题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 该题是leetcode的中等题,深复制一个链表,难点在于怎么复制节点的随机节点。思路:用一个hashmap存放着两个node节点,这两个node节点都相同,目的是为了在后面遍历时连接节点的next和random。 代码如下: class Solution { ...原创 2020-04-12 16:35:03 · 77 阅读 · 0 评论 -
leetcode #86 分隔链表
题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。应当保留两个分区中每个节点的初始相对位置。 实例: 该题是leetcode的中等题,思路不复杂,先创建两个链表less_head,more_head和两个分别指向less_head和more_head的指针less_ptr和more_ptr,当遍历链表时,当前节点的值小于x的话,les...原创 2020-04-12 15:27:12 · 113 阅读 · 0 评论 -
leetcode #142 环形链表II
题目描述 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 该题是中等题,在141题的基础上继续拓展,找到相交的起始节点。思路:这题是快慢指针的经典,首先用快慢指针遍历链表找出相遇的节点meet,如果找不到说明没有环;找到后,此时头节点和相遇节点到相交的起始节点的长度相等,利用这个规律可找出相交节点。 代码如下: public class Solution { ...原创 2020-04-09 00:02:25 · 127 阅读 · 0 评论 -
leetcode #160 相交链表
题目描述: 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 该题是leetcode链表的简单题,思路:先比较两个链表的长度,将长的链表头指针移动到和短的链表对齐,然后同时遍历两个链表,若两个指针相等,则找到;反之返回null,没有找到相交起始节点。 代码如下: public class Solution { public ListNode ge...原创 2020-04-08 23:29:24 · 116 阅读 · 0 评论 -
leetcode #206 反转一个链表
该题是leetcode的链表简单题,题目要求空间复杂度为O(1),思路:先声明一个新链表的头指针,循环遍历原链表时,先用一个指针标记一下下个要循环的节点,然后原链表指针指向新链表,因为要反转链表,所以新链表的指针后移,继续循环遍历。 代码如下: class Solution { public ListNode reverseList(ListNode head) { Lis...原创 2020-04-06 23:16:03 · 89 阅读 · 0 评论