剑指Offer 18 删除链表的节点
剑指 Offer 原版
题目
(1)在 O(1)
的时间内删除链表的节点。
给定单向链表的头指针和一个节点指针,定义一个函数在 O(1)
时间内删除该节点。
解答
解答1[Java]
LeetCode 版本
解答
解答1[Java]
1 | public class Problem18Solution1 { |
(1)在 O(1)
的时间内删除链表的节点。
给定单向链表的头指针和一个节点指针,定义一个函数在 O(1)
时间内删除该节点。
1 | public class Problem18Solution1 { |
Index | Problem ID | Title and Link |
---|---|---|
1 | 2 | 剑指Offer 2. 实现单例模式 |
2 | 3 | 剑指Offer 3. 数组中重复的数字 |
3 | 4 | 剑指Offer 4. 二维数组中的查找 |
4 | 5 | 剑指Offer 5. 替换空格 |
5 | 6 | 剑指Offer 6. 从尾到头打印链表 |
6 | 7 | 剑指Offer 7. 重建二叉树 |
7 | 8 | 剑指Offer 8. 二叉树的下一个节点 |
8 | 9 | 剑指Offer 9. 用两个栈实现队列 |
9 | 10 | 剑指Offer 10. 斐波那契数列 |
10 | 11 | 剑指Offer 11. 旋转数组的最小数字 |
11 | 13 | 剑指Offer 13. 机器人的运动范围 |
12 | 39 | 剑指Offer 39. 二叉树的深度 |
13 | 67 | 剑指Offer 67. 把字符串转换成整数 |
输入数字 n,按照顺序打印出从 1 到最大的 n 位十进制数。
1 | public class Problem17Solution1 { |
使用字符串表示数字,同时模拟加法运算,处理进位等操作。
1 | public class Problem17Solution2 { |
全排列的方式,通过递归实现。
正常值:1、2、3…
边界值:0、-1
You are given an array prices
where prices[i]
is the price of a given stock on the ith
day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
Example 1:
1 | Input: prices = [7,1,5,3,6,4] |
Example 2:
1 | Input: prices = [1,2,3,4,5] |
Example 3:
1 | Input: prices = [7,6,4,3,1] |
Constraints:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104
1 | public class Problem122Solution1 { |
假设股价是连续上涨的,比如 [1, 2, 3, 4, 5],那么我们第一天买,然后第 5 天卖,其实等价于,第 1 天买,第 2 天卖,第 2 天再买, 第 3 天再卖。只要后一天比前一天价格高,我们就做操作。反之,如果后一天比前一天估计低,我们就不操作。
这种思路其实就是贪心算法的思路。
题目链接:https://leetcode.com/problems/longest-increasing-subsequence/
题解链接:https://leetcode.com/articles/longest-increasing-subsequence/
Given an unsorted array of integers, find the length of longest increasing subsequence.
Example:
1 | Input: [10,9,2,5,3,7,101,18] |
Note:
Follow up: Could you improve it to O(n log n) time complexity?
递归的方式,从第一个数字开始遍历,遍历每一个数字的时候,都存在两种情况,当前数字比最大递增字串中的最后一个数字大或者比最后一个数字小。如果当前数字比最长递增子串的最后一个数字小,那么当前数字肯定不能加入到最长递增子串中。但是如果当前数字比最长的最后一个数字大,那么可以把当前数字加入到最长递增字串中,也可以不加入。因为存在这么一种情况,当前位置的数字特别大,如果把当前位置的数字加入到最长递增字串中,后边就再也无法增加数字了。但是如果不把当前数字加入到最长递增子串中,那么后边还能继续添加其他的数字。
判断当前数字和当前最长递增子串的最后一个数字的关系,如果比前一个数字更大,那么下一步就算一下包含当前数字和不包含当前数字的情况。如果比前一个数字小,那么下一步就计算一下不包含当前数字的情况。
1 | public class Solution { |
时间复杂度:$O(2^n)$
空间复杂度:$O(n^2)$
感觉这个方法不太容易理解,现在也没有很好的理解缓存所代表的意义。
但是如果没有彻底理解的话,就简单的把缓存当作是某些参数的结算结果,或许可以达到初步理解。
1 | public class Solution { |
思路:利用一个临时数组 dp[]
,dp[i]
表示截止到当前位置的最大递增子串的长度。这样,假如向原数组后边继续追加新的数字,只需要把新数字和数组中前边位置的数字作比较,只要比前边的数字大,就表示当前位置的最大递增字串的长度至少是 dp[i] + 1
,把所有数字遍历下来就可以知道当前位置的最大递增字串的长度。
1 | public class Problem300Solution3 { |
思路:既然要求的是最大递增子串的长度,那么就找到其中一个最长递增子串。从第一个数字开始遍历,只要能形成递增数列就加到末尾,如果比当前的最长递增子串的最大值要小,就替换掉最长递增子串中的一个刚好比这个数字小的数字。
1 | public class Solution { |
时间复杂度:$O(nlog n)$
空间复杂度:$O(n)$
题目地址:https://leetcode.com/problems/reverse-words-in-a-string/
Given an input string, reverse the string word by word.
Example 1:
1 | Input: "the sky is blue" |
Example 2:
1 | Input: " hello world! " |
Example 3:
1 | Input: "a good example" |
Note:
Follow up:
For C programmers, try to solve it in-place in O(1) extra space.
题目地址:https://leetcode.com/problems/rotate-array/
题解地址:https://leetcode.com/articles/rotate-array/
Given an array, rotate the array to the right by k steps, where k is non-negative.
Follow up:
Example 1:
1 | Input: nums = [1,2,3,4,5,6,7], k = 3 |
Example 2:
1 | Input: nums = [-1,-100,3,99], k = 2 |
Constraints:
1 <= nums.length <= 2 * 10^4
nums[i]
fits in a 32 bit-signed integer.k >= 0
一次向右移动 1 位,移动 k 次。
略
使用和原数组大小相同的额外数组,直接把原数组元素放置到新数组对应位置上。
略
从第一个元素开始依次向后移动,每次都先把下一个元素缓存起来,这样最终会循环到最初的位置。
整体翻转一次。
把前 k 个翻转一下。
把后 n-k 个翻转一下。
The Fibonacci numbers, commonly denoted F(n)
form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0
and 1
. That is,
1 | F(0) = 0, F(1) = 1 |
Given N
, calculate F(N)
.
Example 1:
1 | Input: 2 |
Example 2:
1 | Input: 3 |
Example 3:
1 | Input: 4 |
Note:
0 ≤ N
≤ 30.
1 | class Solution { |
时间复杂度:
空间复杂度:
1 | class Solution { |
时间复杂度:$O(n)$
空间复杂度:$O(1)$
1 |