算法
阵雨~
never stop thingking
展开
-
11. Container With Most Water盛水最多的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且n的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能...原创 2020-02-06 22:36:34 · 212 阅读 · 0 评论 -
169. Majority Element求众数
题目给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例1:输入: [3,2,3] 输出: 3示例2:输入: [2,2,1,1,1,2,2] 输出: 2第一时间想到了排序,因为排序后数字按顺序,直接可以比较是否相等,然后设置两个计数器,比大小,最后...原创 2019-11-22 21:40:36 · 302 阅读 · 0 评论 -
7. 反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转。示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。 这题思路很简单,就是每...原创 2018-08-29 18:03:40 · 197 阅读 · 0 评论 -
27. 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 我的思路:1.循环遍历发现重复元素,所有该元素后的元素前进一,覆盖掉重复元素2.发生重复,记录减少元素次数,数组长...原创 2018-08-29 14:47:26 · 137 阅读 · 0 评论 -
9. 回文数
9. 回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。我的思路:1.通过取整运算和求余运算获取最高位和最低位,while循环得到所有数字2.转化成字符串,通过for循环charAt()方法遍历字符串public class question9 { /*判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一...原创 2018-08-29 11:04:54 · 166 阅读 · 0 评论 -
圆圈中最后剩下的数字——剑指offer(Java)
/*题目 * 圆圈中最后剩下的数字 (约瑟夫环) * */ /*思路 * 不管第几个 圆圈内都是循环的,求余数就可以 * 注意要点 每次删除一个数,要从删除的下一个数开始 * 所以核心公式 bt + m - 1,以为数次 从0开始 故m-1, * 从删除数下一个 就是bt的位置 ,因为环里删除一个数, ...原创 2019-03-20 11:33:15 · 308 阅读 · 0 评论 -
二进制中1的个数——剑指offer(Java)
/*题目 *输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 * *//*思路 * * (n-1) & n 操作会使 末尾变0 * 5 =》 101 4 =》 100 101 & 100 = 100; 如果有1继续再来 知道a=0; * * 概念: 1 & 1 = 1 1 & 0 = 0 * */ ...原创 2019-02-26 18:02:18 · 234 阅读 · 0 评论 -
二维数组中查找目标值——剑指offer(Java)
/*题目* 在一个二维数组中,每一行从左到右递增,每一列从上到下递增* 输入一个二维数组和目标值,判断数组是否含有该目标值* *//* 分析 * 到右下角都是递增的,所以选一行列的最大值开始查找,即右上或者左下 * 因为是递增,所以判断比原来元素大还是小,直接移动 * 在一列看,只要比他小就上移动,因为最左边一列就是本行最小值,小了就直接排除,进入下一行 * 一旦一个数比左下角...原创 2019-02-26 16:20:47 · 689 阅读 · 0 评论 -
字符流中第一个不重复的数字——剑指offer(Java)
/*题目 * 请实现一个函数用来找出字符流中第一个只出现一次的字符 * *//*思路 * * 巧用 字符数组解决问题, ch[c]++ ,用来标记出现的次数, 等于1的时候只出现一次 * */ char[] chars = new char[256]; StringBuilder sb = new StringBuilder(); public c...原创 2019-02-26 01:59:53 · 173 阅读 · 0 评论 -
表示数值的字符串——剑指offer(Java)
/*题目 *请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 * * *//*思路 *例如,字符串 “+100”、”5e2”、”-123”、”3.1415” 以及 “-1E-16” 都表示数值, * 但”12e”、”1a3.14”、”1.2.3”、”+-5” 以及 “12e+5.4” 都不是 * 具体思路见代码注释 * */ public boolean...原创 2019-02-26 01:57:48 · 291 阅读 · 0 评论 -
字符串转为整数——剑指offer(Java)
/*题目 * 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数 * (数值为0或者字符串不是一个合法的数值则返回0)。 * *//*思路 * "-4c+4\@ AD " * 注意以上字符, 字符0 对应48 9对应57,完美的将数字剔除出来 1.只有第一位可以是符号位 2.其他为只能为数字 48<x<57 3.最后将字符累加 *...原创 2019-02-25 21:30:29 · 214 阅读 · 0 评论 -
第一个出现一次的字符——剑指offer(Java)
/*题目 *在一个字符串中找到第一个只出现一次的字符。如输入acbacd,则输出b。 * * *//*思路 * 要想找到这一个字母 必须全部遍历还要记录次数 * 双层循环可以解决,但是时间复杂度为 o(n^2) * 利用hash结构,空间换时间,存储字母出现的次数, 时间复杂度变为,o(n) * 知识点: linkedhashMap 输入与输出位置一只 比hashMap...原创 2019-02-24 16:26:44 · 157 阅读 · 0 评论 -
替换字符串中的空格——剑指offer(Java)
/*题目* 将一个字符串中的空格替换为 "%20"* *//*思路与注意点* 1.循环比较字符串单个字母,空格追加“%20”,否则追加字母* 2.在组成新的字符串的过程中,大量字符串组成String效率太低,采用StringBuilder,StringBuffer* 易出错:str.chart(i)并不能equals,需要转换成字符串* */ public static S...原创 2019-02-24 12:23:59 · 427 阅读 · 0 评论 -
反转字符串——剑指offer(Java)
/*题目 * 翻转字符串,字符串中的单词不翻转,单词以空格隔开 * I love you => you love I *//*思路 * 先反转整个字符串,再将单词反转 * 易混淆知识点:length为数组方法,length()为String方法 * */ public String ReverseSentence(String str){ i...原创 2019-02-24 11:43:11 · 443 阅读 · 0 评论 -
判断二叉树A是否包含子树B——剑指offer(Java)
/*题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)** *//*思路** 先从根节点开始判断,* 1.如果根节点相同,则从头遍历* 2.如果根不同,则从左右两个遍历,任意一个含有B树都可以,如果失败则递归* doesTree1HasTree2函数负责递归两个遍历两个树,直到B树为空则返回true其余都是false** */...原创 2019-02-23 21:35:13 · 1619 阅读 · 2 评论 -
数组中只出现一次的数字——剑指offer(Java)
/*题目 *一个整型数组里除了两个数字之外,其他的数字都出现了两次,请找到这两个只出现一次的数字 * *///知识点温习:两个相同的数异或 为 0,异或满足交换律和结合律/*思路 * 时间复杂度o(n) 空间复杂度o(1) * 将数组所有的数异或,最终只剩两个不相同的数异或结果,其余数被抵消, * 然后找出这个异或数 中的 位数为1的那一位,因为异或必定在此位上结果不同,为1或...原创 2019-02-21 15:16:03 · 99 阅读 · 0 评论 -
滑动窗口的最大值——剑指offer(Java)
/*题目*给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,* 那么一共存在6个滑动窗口:{[2,3,4],2,6,2,5,1},* {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,...原创 2019-02-21 10:54:38 · 178 阅读 · 0 评论 -
用两个栈实现队列
/*题目*用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。* *//*思路* 这个题目其实算是一道简单题,只要有数据结构理论的,完全可以理解整个过程,其核心思想就是两个栈,* 一个用来push原始进入,类似仓库的功能,仓库的元素按照栈的规则存放入货架,再从货架pop元素就可以了, 栈 先进后出 队列 先进先出* 注意点: 一定要 stack...原创 2019-02-20 13:04:34 · 106 阅读 · 0 评论 -
从尾到头打印链表——剑指offer(Java)
/*题目* 输入一个链表,从尾到头打印链表的每一个节点值** *//*思路* 借助栈实现,或使用递归* 栈具有先进后出,可以从尾到头** */ class ListNode{ int val; ListNode next=null; public ListNode(){ } public Li...原创 2019-02-18 13:24:47 · 102 阅读 · 0 评论 -
二叉搜索树转换双向链表——剑指offer(Java)
/*题目 * 二叉搜索树转换为双向链表 * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 * 比如输入下图中左边儿二搜索树,则输出转换后的排序双向链表。 * 4 / \ 2 5 / \ / \ 1 3 5 7 4=6=8=10=12=14=16 * *//*思路...原创 2019-02-18 12:01:02 · 2062 阅读 · 0 评论 -
删除链表中重复的节点——剑指offer(Java)
/*题目 * 在一个排序的链表中,存在着重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针 * 1 -》 2 -》 2 -》 3 -》 3 -》 4 -》 5 * 删除后 1 -》 4 -》 5 * *//*思路 * 遍历节点的同时判断当前节点与下一个节点是否相同,如果相同则删除, * 删除方法 使用相同节点的前一个节点,指向相同节点的下一个节点如图 *...原创 2019-02-17 19:38:55 · 2972 阅读 · 3 评论 -
找出两个链表的第一个公共节点——剑指offer(Java)
/*题目 * 输入两个链表,找出他们的第一个公共节点 * *//*思路 * 1.使用哈希表,将一个链表储存进去,再遍历另一个链表,与哈希表对比 * 2.求出两个链表的长度,然后长的链表把多出节点个数先走掉,两个链表在同时开始走 * 时间复杂度为 O(m + n),空间复杂度为O(1) * * 下面这个编码就是这个原理,但是代码较难理解,看图示 一步一步就理解了 * ...原创 2019-02-17 18:00:22 · 600 阅读 · 0 评论 -
链表中环的入口节点——剑指offer(Java)
/*题目 * 链表中包含环,请找出该链表的环的入口节点 * *//*思路 * 1.使用哈希表,但是空间复杂度为O(n) * 2.使用快慢指针,slow 一次走一步,fast一次走两步,当两个相遇时,fast指针再重新指向head * 此时fast一次走一步,slow一次走一步,再次相遇则为入口 * */方法2的数学原理,见以下链接,讲的比较详细。https://blog....原创 2019-02-16 21:50:33 · 304 阅读 · 0 评论 -
复杂链表的复制——剑指offer(java)
/*题目 *输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点), * 返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) * *//*思路 * 1.利用哈希表辅助空间 2.不用辅助空间,相当于边遍历链表,边把链表复制。 * */其实链表的题目大多数是可以不通过...原创 2019-02-16 18:19:02 · 137 阅读 · 0 评论 -
O(1)时间删除链表节点——剑指offer(Java)
题目: 在O(1)时间内删除链表节点 思路: /*如果题目要求为O(n)则遍历就可以 * 但是题目要求是O(1)所以只能一次查询就完成 * 直接将后一个元素的值赋予前一个,改变指针时间复杂度就为1 * 但是如果删除元素为末尾就是O(n) * 我们知道要删除的节点是谁就知道下一个节点,所以 * 1.将下一个节点的数据赋...原创 2019-02-16 17:24:42 · 204 阅读 · 0 评论 -
重新开始刷算法题的一些感想
最近又开始重新练习算法题,突然明白算法并不是一开始就要得 完美的解决方案,完美的答案只不过是通过不断思考和优化得到的最终结果,我们可以从最初的暴力求解开始,然后一步一步优化,打补丁。重要的是思考过程,因为他就像是钓鱼的技术,不管换什么鱼竿和地方,有技术都能钓到鱼。拿到问题后,先分析问题有什么特征,运用已有的知识是否能解决,已有的知识他就是经验,题做的多了经验就丰富,就不用每次都从暴力求解考试了...原创 2019-11-06 22:50:49 · 357 阅读 · 0 评论 -
三数之和 3Sum leetcode
leetcode 15.三数之和 3Sum第一步:判断问题类型,观察 信息之间关系,除了暴力求解,是否有稍微更好一点的解法,如果没有用最简单的方法进行暴力求解法测试中发现有重复问题,解决重复,发现排序才可以更好的解决重复。以此写出第一个代码class Solution { public List<List<Integer>> threeSu...原创 2019-11-06 22:53:19 · 556 阅读 · 0 评论 -
认识回溯算法
目录 原理相似算法实现提高效率的技巧使用场景经典回溯算法案例原理回溯算法思想有点像时空穿越,就是每次面对选择时从一组可能的解中,选择一个满足要求的解,如果当你发现选错了的时候,就穿越时空回到上一个时间点重新选择。回溯算法本质上就是枚举,枚举所有的解,找到符合的解。 相似算法贪心算法:每次面对选择的时候做出最优的选择,这样一直选下去,使得最终解为最...原创 2019-02-12 16:08:15 · 363 阅读 · 0 评论