力扣(
LeetCode)是著名的在线
算法题库,其中第44题通常被称为“数组中第二小的元素”,英文原名是 "Second Minimum Number"。这个题目要求你在给定的未排序整数数组中找到并返回第二个最小的元素。如果你遇到的是 C
语言相关的版本,你可以考虑以下解法:
1. 遍历法:可以先遍历整个数组,记录下最小值和次小值,时间复杂度为 O(n)。
```c
int findSecondMinimum(int nums[], int size) {
int min = INT_MAX;
int secondMin = INT_MAX;
for (int i = 0; i < size; i++) {
if (nums[i] < min) {
secondMin = min;
min = nums[i];
} else if (nums[i] > min && nums[i] < secondMin) {
secondMin = nums[i];
}
}
return secondMin == INT_MAX ? -1 : secondMin; // 如果没有找到第二个最小值,则返回-1 或者其他适当的默认值
}
2. 排序法:也可以对数组进行排序,然后直接返回第二个元素。但是请注意,这会改变原始数组的状态,且时间复杂度提升到 O(n log n)。```c#include <stdio.h>#include <stdlib.h>// 对数组进行快速排序并获取第二个元素int findSecondMinimumQuickSort(int nums[], int left, int right) {int len = right - left + 1;if (len <= 1) return -1; // 排序后至少有2个元素int pivotIndex = partition(nums, left, right);if (pivotIndex == 1) return nums[1]; // 第二小的就是第一个非最小子return findSecondMinimumQuickSort(nums, left, pivotIndex - 1) ||findSecondMinimumQuickSort(nums, pivotIndex + 1, right); // 分治查找}// QuickSort 的枢轴划分函数int partition(int nums[], int left, int right) {int pivot = nums[right], i = left - 1;for (int j = left; j < right; j++) {if (nums[j] < pivot) {i++;swap(&nums[i], &nums[j]);}}swap(&nums[i + 1], &nums[right]);return i + 1;}// 交换两个元素void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;}int main() {int nums[] = {1, 2, 3, 5, 6};int size = sizeof(nums) / sizeof(nums[0]);printf("Second minimum is: %d", findSecondMinimumQuickSort(nums, 0, size - 1));return 0;}
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15662.html