Skip to content

Commit f5279aa

Browse files
committed
update
1 parent 6a46965 commit f5279aa

File tree

5 files changed

+226
-0
lines changed

5 files changed

+226
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 两数之和 II - 输入有序数组
2+
3+
## 题目描述
4+
5+
给定一个已按照 **升序排列** 的有序数组,找到两个数使得它们相加之和等于目标数。
6+
7+
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
8+
9+
* 返回的下标值(index1 和 index2)不是从零开始的。
10+
* 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
11+
12+
```
13+
输入: numbers = [2, 7, 11, 15], target = 9
14+
输出: [1,2]
15+
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
16+
```
17+
18+
## 分析
19+
20+
双指针寻找结果即可。
21+
22+
## 算法
23+
24+
```java
25+
26+
class Solution {
27+
public int[] twoSum(int[] numbers, int target) {
28+
int left = 0, right = numbers.length - 1;
29+
while(left < right){
30+
if(numbers[left] + numbers[right] == target){
31+
return new int[]{left + 1, right + 1};
32+
}else if(numbers[left] + numbers[right] < target){
33+
left++;
34+
}else{
35+
right--;
36+
}
37+
}
38+
return new int[0];
39+
}
40+
}
41+
```

0189-旋转数组.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# 旋转数组
2+
3+
## 题目描述
4+
5+
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
6+
7+
```
8+
输入: [1,2,3,4,5,6,7] 和 k = 3
9+
输出: [5,6,7,1,2,3,4]
10+
解释:
11+
向右旋转 1 步: [7,1,2,3,4,5,6]
12+
向右旋转 2 步: [6,7,1,2,3,4,5]
13+
向右旋转 3 步: [5,6,7,1,2,3,4]
14+
15+
输入: [-1,-100,3,99] 和 k = 2
16+
输出: [3,99,-1,-100]
17+
解释:
18+
向右旋转 1 步: [99,-1,-100,3]
19+
向右旋转 2 步: [3,99,-1,-100]
20+
```
21+
22+
* 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
23+
* 要求使用空间复杂度为 O(1) 的 原地 算法。
24+
25+
## 分析
26+
27+
将整个数组翻转后,在根据k的值将数组分割为两个数组分别翻转即可。
28+
29+
```
30+
例如 [1,2,3,4,5,6,7] 和 k = 3
31+
32+
第一次翻转 为 [7,6,5,4,3,2,1]
33+
k = 3, 将数组分割为 0-2 和 3-6 分别翻转 结果为 [5,6,7,1,2,3,4]
34+
```
35+
36+
## 算法
37+
38+
```java
39+
class Solution {
40+
public void rotate(int[] nums, int k) {
41+
int len = nums.length;
42+
k %= len;
43+
reverse(nums, 0, len - 1);
44+
reverse(nums, 0, k - 1);
45+
reverse(nums, k, len - 1);
46+
}
47+
48+
private void reverse(int[] nums, int start, int end){
49+
while(start < end){
50+
int temp = nums[start];
51+
nums[start++] = nums[end];
52+
nums[end--] = temp;
53+
}
54+
}
55+
}
56+
```

0197-SQL-上升的温度.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# SQL-上升的温度
2+
3+
## 题目描述
4+
5+
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
6+
7+
```
8+
+---------+------------------+------------------+
9+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
10+
+---------+------------------+------------------+
11+
| 1 | 2015-01-01 | 10 |
12+
| 2 | 2015-01-02 | 25 |
13+
| 3 | 2015-01-03 | 20 |
14+
| 4 | 2015-01-04 | 30 |
15+
+---------+------------------+------------------+
16+
```
17+
18+
例如,根据上述给定的 Weather 表格,返回如下 Id:
19+
20+
```
21+
+----+
22+
| Id |
23+
+----+
24+
| 2 |
25+
| 4 |
26+
+----+
27+
```
28+
29+
## SQL
30+
31+
```sql
32+
select a.Id from Weather as a
33+
join Weather as b
34+
on a.Temperature > b.Temperature
35+
and dateDiff(a.RecordDate, b.RecordDate) = 1
36+
```

0199-二叉树的右视图.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 二叉树的右视图
2+
3+
## 题目描述
4+
5+
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
6+
7+
```
8+
输入: [1,2,3,null,5,null,4]
9+
输出: [1, 3, 4]
10+
解释:
11+
12+
1 <---
13+
/ \
14+
2 3 <---
15+
\ \
16+
5 4 <---
17+
```
18+
19+
## 分析
20+
21+
层序遍历,将每一层的最后一个元素加入结果集合中即可。
22+
23+
## 算法
24+
25+
```java
26+
/**
27+
* Definition for a binary tree node.
28+
* public class TreeNode {
29+
* int val;
30+
* TreeNode left;
31+
* TreeNode right;
32+
* TreeNode(int x) { val = x; }
33+
* }
34+
*/
35+
class Solution {
36+
public List<Integer> rightSideView(TreeNode root) {
37+
List<Integer> list = new ArrayList<>();
38+
if(root == null) return list;
39+
40+
Queue<TreeNode> queue = new LinkedList<>();
41+
queue.offer(root);
42+
while(!queue.isEmpty()){
43+
int count = queue.size();
44+
TreeNode node = null;
45+
while(count-- != 0){
46+
node = queue.poll();
47+
if(node.left != null) queue.offer(node.left);
48+
if(node.right != null) queue.offer(node.right);
49+
}
50+
list.add(node.val);
51+
}
52+
return list;
53+
}
54+
}
55+
```

0201-数字范围按位与.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 数字范围按位与
2+
3+
## 题目描述
4+
5+
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
6+
7+
```
8+
输入: [5,7]
9+
输出: 4
10+
11+
输入: [0,1]
12+
输出: 0
13+
```
14+
15+
## 分析
16+
17+
当一个数+1时,总会有这么一个规律“某一位后的数字,全部被置为相反数”。
18+
19+
举个例子:010111 + 1 = 011000,则010111 & 011000 = 010000。那么,x & (x+1) 后几位相反数的“与操作”,结果总为0。
20+
21+
所以,当(m,m+1,...n-1,n)进行连续“与操作”时,会按照上述规律被抵消很大一部分,而只剩下n的前缀部分,最后只需将n归位。
22+
23+
举个例子:m = 5(0101), n = 7 (0111)。不停右移,得到n前缀部分为01,最后归位前缀得res=0100=4。
24+
25+
## 算法
26+
27+
```java
28+
class Solution {
29+
public int rangeBitwiseAnd(int m, int n) {
30+
int offset = 0;
31+
for(; m != n; offset++){
32+
m >>= 1;
33+
n >>= 1;
34+
}
35+
return n << offset;
36+
}
37+
}
38+
```

0 commit comments

Comments
 (0)