前言
很多算法小白初期刷题比较迷茫,不知道从何刷起从何入手,也不知道怎么使用LeetCode,这篇带你高效使用力扣,让刷题进大厂的路上不再迷茫! 1、反转链表 反转一个单链表:
输入:
1->2->3->4->5 输出: 5->4->3->2->1
方法1:
迭代,重复某一过程,每一次处理结果作为下一次处理的初始值,这些初始值类似于状态、每次处理都会改变状态、直至到达最终状态。 从前往后遍历链表,将当前节点的next指向上一个节点,因此需要一个变量存储上一个节点prev,当前节点处理完需要寻找下一个节点,因此需要一个变量保存当前节点curr,处理完后要将当前节点赋值给prev,并将next指针赋值给curr,因此需要一个变量提前保存下一个节点的指针next。
1、将下一个节点指针保存到next变量 next = curr.next 2、将下一个节点的指针指向prev,curr.next = prev 3、准备处理下一个节点,将curr赋值给prev 4、将下一个节点赋值为curr,处理一个节点 方法2: 递归:以相似的方法重复,类似于树结构,先从根节点找到叶子节点,从叶子节点开始遍历大的问题(整个链表反转)拆成性质相同的小问题(两个元素反转)curr.next.next = curr将所有的小问题解决,大问题即解决
只需每个元素都执行curr.next.next = curr,curr.next = null两个步骤即可 为了保证链不断,必须从最后一个元素开始 public class ReverseList { static class ListNode{ int val; ListNode next; public ListNode(int val, ListNode next) { this.val = val; this.next = next; } } public static ListNode iterate(ListNode head){ ListNode prev = null,curr,next; curr = head; while(curr != null){ next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; } public static ListNode recursion(ListNode head) { if (head == null || head.next == null) { return head; } ListNode newHead = recursion(head.next); head.next.next = head; head.next = null; return newHead; } public static void main(String[] args) { ListNode node5 = new ListNode(5,null); ListNode node4 = new ListNode(4,node5); ListNode node3 = new ListNode(3,node4); ListNode node2 = new ListNode(2,node3); ListNode node1 = new ListNode(1,node2); //ListNode node = iterate(node1); ListNode node_1 = recursion(node1); System.out.println(node_1); } } 2、统计N以内的素数
3、寻找数组的中心索引
添加图片注释,不超过 140 字(可选)
4、删除排序数组中的重复项
5、x的平方根
6、三个数的最大乘积
7、两数之和
8、斐波那契数列
9、环形链表
10、排列硬币
11、合并两个有序数组
12、子数组最大平均数
13、二叉树的最小深度
14、最长连续递增序列
15、柠檬水找零
16、三角形的最大周长
17、二叉树遍历
18、省份数量
19、预测赢家
20、香槟塔
21、井字游戏
22、打家劫舍
23、优势洗牌
24、Dota2参议院
算法笔记及代码文档 笔记算法已经打包好了 关注公众号即可获取