剑指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 · 125 阅读 · 0 评论 -
岛屿数量问题
岛屿数量我们可以将二维网格看成一个无向图,竖直或水平相邻的 11 之间有边相连。为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。最终岛屿的数量就是我们进行深度优先搜索的次数。深度优先搜索算法遍历整个二维数组,判断是否为‘1’,如果是则遍历 记住 dfs(grid,i,j)private void dfs我总是出错 写成public终止条件:i和j是否越界,且grid[i][原创 2021-07-14 13:58:13 · 192 阅读 · 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 · 133 阅读 · 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 · 219 阅读 · 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 · 467 阅读 · 0 评论 -
剑指offer12 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。思路:DFS加剪枝法:回溯访问数组内任意一个元素,以其为起点,然后分别遍历上下左右字符是否与下一个字符相对。遍历过的字符用‘、0‘。如果不符合条件则将其回溯回原值’’class Solution { p原创 2021-06-18 17:33:40 · 69 阅读 · 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 · 62 阅读 · 0 评论 -
Leedcode 题目最大子序和
动态规划对数组遍历。ans设为最大值,sum设为和。Math,max保存其最大值。这道题用动态规划的思路并不难解决,比较难的是后文提出的用分治法求解,但由于其不是最优解法,所以先不列出来动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字每次比较 sum 和 ans的大小原创 2021-06-01 20:55:29 · 188 阅读 · 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 · 76 阅读 · 0 评论 -
剑指offer10.
剑指 Offer 10- I. 斐波那契数列‘’写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路:用动态规划求解。初始状态 dp[原创 2021-05-17 15:43:52 · 75 阅读 · 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 · 75 阅读 · 0 评论 -
剑指offer03
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3class Solution {public int findRepeatNumber(int[] nums) {Set a = new HashSet();int repeat=-1;for(int num原创 2021-05-12 20:09:18 · 67 阅读 · 0 评论