![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
leslie春夏秋冬
这个作者很懒,什么都没留下…
展开
-
for循环与foreach性能比较与适用场景
for循环for(int i=0;i<100;i++){ a = i;} foreach循环for(int i : integers){ a = i;}//等同于for(Iterator<Integer> i=list.iterator();i.hasNext();){ a = i.next(); }性能上的区别:对于linkedlist,是单链表,使用for循环每次都要从第一个元素读取next域来读取,速度非常慢;例如:从a.原创 2020-08-19 16:10:06 · 816 阅读 · 0 评论 -
BFS广度优先搜索技巧
剑指 Offer 32 - II. 从上到下打印二叉树 II从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。注意事项,queue中类型是Treenode,size每次遍历完一层要减1。思路:每次遍历完一层添加进list,每一层中如果有左右子节点则加入队列。每一次遍历都让队列里的当前层出队,若是队列为空则结束。答案:/** * Definition for a binary tree node. * public class TreeNode { * in原创 2020-08-19 11:20:52 · 177 阅读 · 0 评论 -
使用PriorityQueue实现大小根堆
1.一个基于优先级堆的无界优先级队列。优先级队列的元素默认按照其自然顺序进行排序(即默认小根堆),大根堆需要通过构造方法重写Comparator接口的compare方法。2.初始容量为11,线程不安全,线程安全的实现结构为PriorityBlockingQueue。3.小根堆的实现public class findTopK { //找出前k个最大数,采用小顶堆实现 public static int[] findKMax(int[] nums, int k) { Pr原创 2020-08-18 22:11:58 · 543 阅读 · 0 评论 -
如何反转int类型数字?
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21先来波愚蠢的解法。。只超过了12%思路:如果有-号记下来,后面转换回int时使用;如果末位是0,直接舍弃末位;然后反转后判断是否溢出,这里用了long,不太符合题目要求了。class Solution { public int reverse(int x) { String原创 2020-06-07 20:31:31 · 1204 阅读 · 0 评论 -
最长公共前缀的两种解法
leetcode14.最长公共前缀第一种解法:对字符串数组中的每一列字符同步对比 if(strs == null||strs.length == 0){ return ""; } for(int i=0;i<strs[0].length();i++){ char c = strs[0].charAt(i); for(int j=1;j<strs.length;j++){原创 2020-06-07 19:27:10 · 137 阅读 · 0 评论 -
如何判断链表是否有环?
leetcode141. 环形链表这里讲快慢指针的解法,hash表要申请额外空间不在这里讲解。思路:定义快指针一次走两步,慢指针一次走一步,如果存在环,快慢指针一定会相遇。类似两个人在操场跑步,快的人一定会和慢的那个相遇。/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val =原创 2020-06-03 17:05:12 · 75 阅读 · 0 评论 -
最大子序和
leetcode53. 最大子序和以下为本人题解:还可以申请dp数组利用动态规划来做,思路一样,只是保存在了新数组里面。原创 2020-05-24 16:02:37 · 90 阅读 · 0 评论 -
查找数组中是否有重复元素
leetcode217. 存在重复元素例子:给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。方法1:利用set集合,如果当前元素存在,添加时返回false,否则返回true。public boolean containsDuplicate(int[] nums) { HashSet<Integer> set = new HashSet(); for (int a : num原创 2020-05-24 14:53:07 · 2295 阅读 · 0 评论 -
如何以常数时间找到栈中的最小值?
leetcode155. 最小栈思路:利用辅助栈1.在push的时候主栈直接push,对于辅助栈如果栈为空,直接push,如果栈不为空,判断push的值是否比栈顶值小,如果小于等于,则push,反之不push。2.pop的时候主栈判断不为空后直接pop,辅助栈判断不为空后,如果pop的值等于栈顶的值,辅助栈pop,反之不pop。3.getMin的时候直接获取辅助栈栈顶元素即是当前最小值。代码如下:class MinStack { //辅助栈81% // Stack<Inte原创 2020-05-24 12:29:34 · 322 阅读 · 0 评论 -
如何判断两个链表是否相交?并获得相交链表头节点。
题目参考leetcode160. 相交链表思路:定义两个指针,一个指向链表1,另一个指向链表2;让两个指针相同速度移动到末尾,当a指针指向null时返回到链表2头部,b指针指向null时返回到链表1头部。继续向末尾移动,相交的点即为相交链表部分的头节点。代码如下:public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode a = h原创 2020-05-23 21:35:18 · 112 阅读 · 0 评论 -
出错: bad operand types for binary operator ”^“,关于java中运算符优先级问题
遇到问题的原代码如下: int start = 0; int end = l-1; while(start<end){ if(num[start]^num[end] == 0){ start++; end--; }else{ return false; } }报错,bad oper原创 2020-05-23 00:40:26 · 2294 阅读 · 0 评论 -
java的int类型转换为int数组
int x = 123;String str = String.valueOf(x);int l = str.length();int[] num = new int[l]; for(int i=0;i<l;i++){ num[i] = str.charAt(i);}比较简单,积累细节!原创 2020-05-23 00:29:21 · 2148 阅读 · 2 评论 -
合并两个有序链表
leetcode21. 合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //不应该这样定义,curl1是一个指在l1点的指针,会影响到原创 2020-05-22 14:30:18 · 91 阅读 · 0 评论 -
Java中Map的3种遍历方式
第一种,利用Map的entrySet()方法for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());第二种,利用Iterator来遍历注意:在遍历过程中remove操作,只能用iterator遍历方式,其他遍历会抛异常,(顺便补充,list通过Iterator方式可正确遍历完成re原创 2020-05-20 13:51:02 · 181 阅读 · 0 评论 -
遇到根据某个变量个数比较大小,变量个数一样比较变量大小时的技巧
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。示例 1:输入:arr = [0,1,2,3,4,5,6,7,8]输出:[0,1,2,4,8,3,5,6,7]解释:[0] 是唯一一个有 0 个 1 的数。[1,2,4,8] 都有 1 个 1 。[3,5,6] 有 2 个 1 。[7] 有 3 个 1 。按照 1 的个数排序得到的结果数组为 [0,1,原创 2020-05-13 11:52:19 · 428 阅读 · 0 评论 -
找出数组中出现次数超过一半的数字
根据数组的特点找出:O(n)算法数组中有一个数字出现的次数超过数组长度的一半,即这个数字出现的次数比其他所有数字出现的次数的和还要多。遍历数组的时候保存两个值:数组中元素的值、次数。在遍历下一个数字时,如果下一个数字和之前保存的数字相同,则次数加1;如果下一个数字和之前保存的数字不相同,则次数减1。如果次数为0,则保存下一个数字,并把次数设为1。由于要找的数字出现的次数比其他所有数字出现的次数之...转载 2020-04-25 23:16:26 · 190 阅读 · 0 评论 -
栈
1.平衡符号 编译器需要检查代码的语法错误,但是常常由于缺少一个符号(如一楼一个花括号或者注释起始符)引起编译器上百行的诊断,而真正的错误并没有找出(在这一点上java编译器还是比较可靠的,但不是所有编译器)。在这种情况下一个有用的工具就是检查符号是否有效。于是每一个左花括号,左方括号以及左圆括号必然有右括号与其对应(比如{[]}是合法的,但是{[}]是错误的)。显然为此编写一个大型程序去校验...原创 2020-04-13 22:38:26 · 107 阅读 · 0 评论 -
只根据先序遍历的结果创建一棵树,则该树是不确定的
只根据先序遍历的结果创建一棵树,则该树是不确定的根据先序遍历的结果还原一棵树 则该树是不确定的例如 先序遍历的结果ABC 有两种形式转载 2020-03-20 00:22:47 · 230 阅读 · 0 评论 -
二叉树的先序,中序,后序遍历
前序遍历: 对访问到的每个结点,先访问根结点,然后是左结点,然后是右结点。中序遍历: 对访问到的每个结点,先访问左结点,然后是根结点,然后是右结点。后序遍历: 对访问到的每个结点,先访问左结点,然后是右结点,然后是根结点。https://img-blog.csdnimg.cn/20190412101040594.png?x-oss-process=image/watermark,type_Z...转载 2020-03-20 00:04:26 · 215 阅读 · 0 评论 -
斐波那契数列(动态规划入门)
斐波那契数列的定义是 f(n + 1) = f(n) + f(n - 1) ,有几种解法:递归法:原理: 把 f(n)问题的计算拆分成 f(n−1) 和f(n−2) 两个子问题的计算,并递归,以 f(0)和 f(1)为终止条件。缺点: 大量重复的递归计算,例如 f(n)和 f(n - 1)两者向下递归需要 各自计算 f(n−2) 的值。有备忘录的递归法:原理:也就是在递归法的基础上创建一...原创 2020-04-10 10:42:24 · 1223 阅读 · 0 评论