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。