剑指offer
爱科研的岩岩
这个作者很懒,什么都没留下…
展开
-
快排算法小结
private static int partition(int[] arr, int startIndex, int endIndex) { int left = startIndex; int right = endIndex; int pivot = arr[startIndex];//取第一个元素为基准值 while (true) { //从左往右扫描 while (arr[left] .原创 2021-07-21 21:56:48 · 107 阅读 · 0 评论 -
岛屿数量问题
岛屿数量 我们可以将二维网格看成一个无向图,竖直或水平相邻的 11 之间有边相连。 为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。 最终岛屿的数量就是我们进行深度优先搜索的次数。 深度优先搜索算法 遍历整个二维数组,判断是否为‘1’,如果是则遍历 记住 dfs(grid,i,j) private void dfs我总是出错 写成public 终止条件:i和j是否越界,且grid[i][原创 2021-07-14 13:58:13 · 177 阅读 · 0 评论 -
最长上升子序列
动态规划 法一:动态规划 思路与算法 定义 dp[i] 为考虑前 i个元素,以第 i个数字结尾的最长上升子序列的长度,注意nums[i] 必须被选取。 初始化为dp[i]=1;即每个元素都为一个递增的起始点,长度为1;如果不初始化数量则会少1,出现错误。 状态方程 dp[i]=max(dp[j]+1) 即i的子串长度为前i-1个子串最大长度加一。 class Solution { public int lengthOfLIS(int[] nums) { int n=nums.le原创 2021-07-14 13:05:02 · 117 阅读 · 0 评论 -
层序遍历迭代法
思想:BFS遍历方法 用队列思想,存储每一层结点,第一层入队列,第二层出队列。 Queue a=new ArrayDeque<>(); 判断root是否为空,不为空则入队列。 判断队列是否为空,不为空则执行循环。 定义每一层的大小n,引入一个list对象 level 出队元素存到level中。之后分别将左子树和右子树入队列。 class Solution { public List<List<Integer>> levelOrder(TreeNode root)原创 2021-07-13 15:49:11 · 199 阅读 · 0 评论 -
删除链表第N个节点
通过定义指针,前后指针,前指针遍历到第n个结点,前后指针一起动。pre指针定义为头结点的前一个指针,防止头结点为空。 class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode pre=new ListNode(0); pre.next=head; ListNode start=pre,end=pre; while(n!=0){ sta原创 2021-06-22 21:21:19 · 441 阅读 · 0 评论 -
剑指offer12 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 思路:DFS加剪枝法:回溯 访问数组内任意一个元素,以其为起点,然后分别遍历上下左右字符是否与下一个字符相对。遍历过的字符用‘、0‘。如果不符合条件则将其回溯回原值’’ class Solution { p原创 2021-06-18 17:33:40 · 55 阅读 · 0 评论 -
剑指offer 05
删除空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 思路:将字符串变成三倍长的字符数组,之后对数组进行遍历,如果字符串遇到空格,则替换成%20,如果不是空格则复制过去。记住最后有个字符数组转成字符串的操作。 由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。 获得 s 的长度原创 2021-06-07 22:10:38 · 50 阅读 · 0 评论 -
Leedcode 题目最大子序和
动态规划对数组遍历。ans设为最大值,sum设为和。Math,max保存其最大值。 这道题用动态规划的思路并不难解决,比较难的是后文提出的用分治法求解,但由于其不是最优解法,所以先不列出来 动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans 如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字 如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字 每次比较 sum 和 ans的大小原创 2021-06-01 20:55:29 · 165 阅读 · 0 评论 -
旋转数组leedcode
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 第一个办法:创建一个新数组,然后再将原有数组copy。 class Solution{ public void romote(int [ ] arr , int k) { int n=arr.length; int [ ] a=new int[n]; for(int i=0;i<n;i++原创 2021-05-28 11:03:14 · 63 阅读 · 0 评论 -
剑指offer10.
剑指 Offer 10- I. 斐波那契数列‘’ 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 思路:用动态规划求解。初始状态 dp[原创 2021-05-17 15:43:52 · 59 阅读 · 0 评论 -
剑指offer24 反转链表
剑指 Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 方法1:迭代:定义一个prev curr next 结点 在遍历链表时,将当前节点的 \textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点原创 2021-05-13 11:16:12 · 57 阅读 · 0 评论 -
剑指offer03
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 class Solution { public int findRepeatNumber(int[] nums) { Set a = new HashSet(); int repeat=-1; for(int num原创 2021-05-12 20:09:18 · 53 阅读 · 0 评论