LeetCode 1978, 167, 226

2024-06-22 13:44
文章标签 leetcode 167 226 1978

本文主要是介绍LeetCode 1978, 167, 226,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1978. 上级经理已离职的公司员工
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 167. 两数之和 II - 输入有序数组
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 226. 翻转二叉树
    • 题目链接
    • 标签
    • 思路
    • 代码

1978. 上级经理已离职的公司员工

题目链接

1978. 上级经理已离职的公司员工

  • Employees的字段为employee_idnamemanager_idsalary

要求

  • 查找这些员工的id,他们的薪水严格少于 $30000 并且他们的上级经理已离职。当一个经理离开公司时,他们的信息需要从员工表中删除掉,但是表中的员工的 manager_id 这一列还是设置的离职经理的id 。
  • 返回的结果按照 employee_id 从小到大排序。

知识点

  1. distinct:对某个字段进行去重。
  2. order by:根据某些字段进行排序。
  3. 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084451

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]