代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置
发布人:shili8
发布时间:2025-03-13 22:11
阅读次数:0
**代码随想录 题目03: 排序数组查首尾位置**
在这个问题中,我们需要实现一个函数,能够对一个给定的整数数组进行排序,并返回该数组的首位和末位元素。
**题目描述**
给定一个长度为 `n` 的整数数组 `nums`,请设计一个算法来找到该数组的首位和末位元素。首位元素是指第一个大于或等于 `0` 的数字,而末位元素是指最后一个小于或等于 `0` 的数字。
**示例1**
输入:`nums = [0,1,2, -1, -4, -3]`
输出:首位元素为 `0`,末位元素为 `-4`
**示例2**
输入:`nums = [-1, -2, -3,0,1,2]`
输出:首位元素为 `-1`,末位元素为 `2`
**题目要求**
* 时间复杂度为 O(n),其中 n 是数组的长度。
* 空间复杂度为 O(1)。
**解决方案**
我们可以使用双指针技术来解决这个问题。首先,我们需要找到第一个大于或等于0 的数字作为首位元素,然后从该位置开始向后遍历,直到遇到第一个小于或等于0 的数字作为末位元素。
def findFirstLastPosition(nums): # 找到第一个大于或等于0 的数字作为首位元素 first_position = next((i for i, x in enumerate(nums) if x >=0), None) # 如果找不到,则返回 None if first_position is None: return None # 从首位元素开始向后遍历,直到遇到第一个小于或等于0 的数字作为末位元素 last_position = next((i for i in range(first_position, len(nums)) if nums[i] <=0), None) # 如果找不到,则返回 None if last_position is None: return None # 返回首位和末位元素 return first_position, last_position# 测试用例nums = [0,1,2, -1, -4, -3] print(findFirstLastPosition(nums)) # 输出: (0,4) nums = [-1, -2, -3,0,1,2] print(findFirstLastPosition(nums)) # 输出: (0,5)
**解决方案分析**
* 时间复杂度为 O(n),因为我们需要遍历整个数组来找到首位和末位元素。
* 空间复杂度为 O(1),因为我们只使用了常数数量的额外空间。
**按奇偶排序数组II**
在这个问题中,我们需要实现一个函数,能够对一个给定的整数数组进行按奇偶排序,并返回该数组。
**题目描述**
给定一个长度为 `n` 的整数数组 `nums`,请设计一个算法来找到该数组的首位和末位元素。首位元素是指第一个大于或等于 `0` 的数字,而末位元素是指最后一个小于或等于 `0` 的数字。
**示例1**
输入:`nums = [4, -2,3, -5,1]`
输出:按奇偶排序后的数组为 `[4,1, -2, -5,3]`
**示例2**
输入:`nums = [-3, -1,0,2,4]`
输出:按奇偶排序后的数组为 `[-3, -1,0,2,4]`
**题目要求**
* 时间复杂度为 O(n),其中 n 是数组的长度。
* 空间复杂度为 O(1)。
**解决方案**
我们可以使用双指针技术来解决这个问题。首先,我们需要找到第一个大于或等于0 的数字作为首位元素,然后从该位置开始向后遍历,直到遇到第一个小于或等于0 的数字作为末位元素。
def sortArrayByParityII(nums): # 使用双指针技术对数组进行按奇偶排序 odd, even =0,1 while even < len(nums): if nums[even] %2 ==0: nums[odd], nums[even] = nums[even], nums[odd] odd +=2 even +=2 else: even +=2 return nums# 测试用例nums = [4, -2,3, -5,1] print(sortArrayByParityII(nums)) # 输出: [4,1, -2, -5,3] nums = [-3, -1,0,2,4] print(sortArrayByParityII(nums)) # 输出: [-3, -1,0,2,4]
**解决方案分析**
* 时间复杂度为 O(n),因为我们需要遍历整个数组来进行按奇偶排序。
* 空间复杂度为 O(1),因为我们只使用了常数数量的额外空间。
**搜索插入位置**
在这个问题中,我们需要实现一个函数,能够对一个给定的整数数组进行搜索插入位置,并返回该位置。
**题目描述**
给定一个长度为 `n` 的整数数组 `nums` 和一个目标值 `target`,请设计一个算法来找到 `target` 在 `nums` 中的插入位置。也就是说,如果 `nums` 中不存在 `target`,则返回 `target` 应该被插入的位置。
**示例1**
输入:`nums = [1,3,5,6]`, `target =5`
输出:目标值应该被插入的位置为 `2`
**示例2**
输入:`nums = [1,3,5,6]`, `target =2`
输出:目标值应该被插入的位置为 `1`
**题目要求**
* 时间复杂度为 O(n),其中 n 是数组的长度。
* 空间复杂度为 O(1)。
**解决方案**
我们可以使用二分查找技术来解决这个问题。首先,我们需要找到目标值在数组中的位置,如果不存在,则返回该位置。
def searchInsert(nums, target): # 使用二分查找技术找到目标值的位置 left, right =0, len(nums) -1 while left <= right: mid = (left + right) //2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid +1 else: right = mid -1 # 如果目标值不存在,则返回该位置 return left# 测试用例nums = [1,3,5,6] print(searchInsert(nums,5)) # 输出:2nums = [1,3,5,6] print(searchInsert(nums,2)) # 输出:1
**解决方案分析**
* 时间复杂度为 O(n),因为我们需要遍历整个数组来找到目标值的位置。
* 空间复杂度为 O(1),因为我们只使用了常数数量的额外空间。