本文主要是介绍LeetCode 1978, 167, 226,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1978. 上级经理已离职的公司员工
- 题目链接
- 表
- 要求
- 知识点
- 思路
- 代码
- 167. 两数之和 II - 输入有序数组
- 题目链接
- 标签
- 思路
- 代码
- 226. 翻转二叉树
- 题目链接
- 标签
- 思路
- 代码
1978. 上级经理已离职的公司员工
题目链接
1978. 上级经理已离职的公司员工
表
- 表
Employees
的字段为employee_id
、name
、manager_id
和salary
。
要求
- 查找这些员工的id,他们的薪水严格少于
$30000
并且他们的上级经理已离职。当一个经理离开公司时,他们的信息需要从员工表中删除掉,但是表中的员工的manager_id
这一列还是设置的离职经理的id 。 - 返回的结果按照
employee_
id 从小到大排序。
知识点
distinct
:对某个字段进行去重。order by
:根据某些字段进行排序。not in
:限制某个字段的值不能存在于后面的值中。例如id not in (1, 2, 3)
表示id
不能等于1, 2, 3
。
思路
本题只是对原表的数据做限制的题,限制为 薪水严格少于30000
(salary < 30000
) 和 上级经理已离职,一个员工的上级经理已离职 可以理解为 它的id
只存在于manager_id
,但是不存在于employee_id
。这样就简单了,将所有员工的employee_id
查出来(可以使用去重,这样会减少下一步比较的次数),然后让manager_id
不存在于这些employee_id
中即可。最后记得加上排序。
代码
selectemployee_id
fromEmployees
wheresalary < 30000
andmanager_id not in (selectdistinct employee_idfromEmployees
)
order byemployee_id
167. 两数之和 II - 输入有序数组
题目链接
167. 两数之和 II - 输入有序数组
标签
数组 双指针 二分查找
思路
注意本题条件中的 该数组已按 非递减顺序排列,这个条件意味着数组是升序的,可以使用双指针,左指针left
从头到尾遍历,右指针right
从尾到头遍历,直到 两指针相遇 或 找到合适答案。
在使用双指针时,更新左右指针的策略是需要考虑的,定义两数之和为两指针指向的数之和sum = numbers[left] + numbers[right]
,因为数组升序,所以 将右指针往左移动就是缩小两数之和、将左指针往右移动就是扩大两数之和。故可以根据目标值target
和两数之和sum
的相对大小来决定 是将右指针往左移动 还是将左指针往右移动。
注意:本题要求返回的索引和数组元素的索引不一样,前者从1开始,后者从0开始,所以前者等于后者加一。
代码
class Solution {public int[] twoSum(int[] numbers, int target) {int left = 0, right = numbers.length - 1;while (left < right) {int sum = numbers[left] + numbers[right];if (sum < target) { // 是时候扩大sum了left++; // 将左指针往右移动} else if (sum > target) { // 是时候缩小sum了right--; // 将右指针往左移动} else { // 找到合适的答案了return new int[]{left + 1, right + 1}; // 本题的索引 = 数组的索引 + 1}}return new int[0]; // 未找到解,保证编译能通过}
}
226. 翻转二叉树
题目链接
226. 翻转二叉树
标签
树 深度优先搜索 广度优先搜索 二叉树
思路
本题使用简单的 递归 就可以解决,每次都先将左子树和右子树反转,然后再将原来的左子节点放到右子节点处、将原来的右子节点放到左子节点处。
代码
class Solution {public TreeNode invertTree(TreeNode curr) {if (curr == null) { // 如果当前节点为空return null; // 则返回空}TreeNode newLeft = invertTree(curr.right); // 获取反转后的新左节点TreeNode newRight = invertTree(curr.left); // 获取反转后的新右节点curr.left = newLeft; // 替换当前节点的左子节点curr.right = newRight; // 替换当前节点的右子节点return curr; // 返回当前节点}
}
这篇关于LeetCode 1978, 167, 226的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!