每日一题 day7

57 阅读3分钟

leetcode977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入: nums = [-4,-1,0,3,10]
输出: [0,1,9,16,100]
解释: 平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入: nums = [-7,-3,2,3,11]
输出: [4,9,9,49,121]

题解:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        for i, num in enumerate(nums):
            nums[i] = num ** 2
        nums.sort()
        return nums

思路:
暴力,先求得平方,后对该数组进行排序。 时间复杂度为O(n+nlogn),即O(nlogn)。

题解:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l, r, k = 0, len(nums) - 1, len(nums) - 1
        res = [0] * (k + 1)
        while l <= r:
            if nums[l] ** 2 < nums[r] ** 2://若原数组右边较大
                res[k] = nums[r] ** 2//右指针所指的值放入新数组
                r -= 1//原数组右指针左移
            else://原数组左边较大
                res[k] = nums[l] ** 2//左指针所指的值放入新数组
                l += 1//原数组左指针右移
            k -= 1//新数组指针左移
        return res

思路:双指针法。先初始化一个空数组。因为是对有序数组求平方,故最大值一定在原数组的最左边或者最右边,故采用双指针法对原数组进行遍历,新数组从右边至左进行遍历,将大的值放入新数组,新数组指针左移。时间复杂度为O(n)。

leetcode1789. 员工的直属部门

表:Employee

+---------------+---------+
| Column Name   |  Type   |
+---------------+---------+
| employee_id   | int     |
| department_id | int     |
| primary_flag  | varchar |
+---------------+---------+
这张表的主键为 employee_id, department_id (具有唯一值的列的组合)
employee_id 是员工的ID
department_id 是部门的ID,表示员工与该部门有关系
primary_flag 是一个枚举类型,值分别为('Y', 'N'). 如果值为'Y',表示该部门是员工的直属部门。 如果值是'N',则否

 

一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为'N'.

请编写解决方案,查出员工所属的直属部门。

返回结果 没有顺序要求 。

返回结果格式如下例子所示:

 

示例 1:

输入:
Employee table:
+-------------+---------------+--------------+
| employee_id | department_id | primary_flag |
+-------------+---------------+--------------+
| 1           | 1             | N            |
| 2           | 1             | Y            |
| 2           | 2             | N            |
| 3           | 3             | N            |
| 4           | 2             | N            |
| 4           | 3             | Y            |
| 4           | 4             | N            |
+-------------+---------------+--------------+
输出:
+-------------+---------------+
| employee_id | department_id |
+-------------+---------------+
| 1           | 1             |
| 2           | 1             |
| 3           | 3             |
| 4           | 3             |
+-------------+---------------+
解释:
- 员工 1 的直属部门是 1
- 员工 2 的直属部门是 1
- 员工 3 的直属部门是 3
- 员工 4 的直属部门是 3

题解:

# Write your MySQL query statement below
SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = 'Y' OR employee_id IN 
    (SELECT employee_id
    FROM Employee
    GROUP BY employee_id
    HAVING count(employee_id) = 1)

思路:即求解满足 primary_flag = 'Y' 或者该 employee_id 对应的只有一个 department_id。