414. Third Maximum Number*

414. Third Maximum Number*

https://leetcode.com/problems/third-maximum-number/

题目描述

Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O ( n ) O(n) O(n).

Example 1:

Input: [3, 2, 1]

Output: 1

Explanation: The third maximum is 1.

Example 2:

Input: [1, 2]

Output: 2

Explanation: The third maximum does not exist, so the maximum (2) is returned instead.

Example 3:

Input: [2, 2, 3, 1]

Output: 1

Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.

C++ 实现 1

注意第三个例子, 相同元素要过滤. 另外, 如果数组中存在 INT32_MIN, 并且刚好是第三大的元素, 比如 [2, 1, INT32_MIN], 这个时候不应该返回数组中的最大值, 但如果按照如下代码最后的返回逻辑, 将会返回 first. 这是有问题的. 因此, first 等的类型设置为 long.

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        long first = INT64_MIN, second = INT64_MIN, third = INT64_MIN;
        for (auto &a : nums) {
            if (a > first) {
                third = second;
                second = first;
                first = a;
            } else if (a > second) {
                if (a == first) continue;
                third = second;
                second = a;
            } else if (a > third) {
                if (a == second) continue;
                third = a;
            }
        }
        return third == INT64_MIN ? (int)first : (int)third;
    }
};

C++ 实现 2

另一种写法. 来自 LeetCode Submission.

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        long first = LONG_MIN, second = LONG_MIN, third = LONG_MIN;
        for (int num : nums) {
            if (num == first || num == second || num == third) continue;
            if (num > first) {
                third = second;
                second = first;                
                first = num;
            } else if (num > second) {
                third = second;
                second = num;
            } else if (num > third) {
                third = num;
            }
        }
        return third == LONG_MIN ? first : third;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Here's an implementation of the program in C: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <math.h> // Global variables for storing statistical values double average = 0.0; int minimum = 0; int maximum = 0; double median = 0.0; double std_dev = 0.0; // Struct for passing arguments to worker threads typedef struct { int* numbers; int count; } thread_args; // Worker thread for calculating average void* calculate_average(void* args) { thread_args* targs = (thread_args*) args; int* numbers = targs->numbers; int count = targs->count; double sum = 0.0; for (int i = 0; i < count; i++) { sum += numbers[i]; } average = sum / count; pthread_exit(NULL); } // Worker thread for calculating minimum void* calculate_minimum(void* args) { thread_args* targs = (thread_args*) args; int* numbers = targs->numbers; int count = targs->count; minimum = numbers[0]; for (int i = 1; i < count; i++) { if (numbers[i] < minimum) { minimum = numbers[i]; } } pthread_exit(NULL); } // Worker thread for calculating maximum void* calculate_maximum(void* args) { thread_args* targs = (thread_args*) args; int* numbers = targs->numbers; int count = targs->count; maximum = numbers[0]; for (int i = 1; i < count; i++) { if (numbers[i] > maximum) { maximum = numbers[i]; } } pthread_exit(NULL); } // Worker thread for calculating median void* calculate_median(void* args) { thread_args* targs = (thread_args*) args; int* numbers = targs->numbers; int count = targs->count; int* sorted_numbers = malloc(count * sizeof(int)); for (int i = 0; i < count; i++) { sorted_numbers[i] = numbers[i]; } for (int i = 0; i < count - 1; i++) { for (int j = i + 1; j < count; j++) { if (sorted_numbers[i] > sorted_numbers[j]) { int temp = sorted_numbers[i]; sorted_numbers[i] = sorted_numbers[j]; sorted_numbers[j] = temp; } } } if (count % 2 == 0) { median = (sorted_numbers[count / 2 - 1] + sorted_numbers[count / 2]) / 2.0; } else { median = sorted_numbers[count / 2]; } free(sorted_numbers); pthread_exit(NULL); } // Worker thread for calculating standard deviation void* calculate_std_dev(void* args) { thread_args* targs = (thread_args*) args; int* numbers = targs->numbers; int count = targs->count; double sum = 0.0; for (int i = 0; i < count; i++) { sum += pow(numbers[i] - average, 2); } std_dev = sqrt(sum / count); pthread_exit(NULL); } int main(int argc, char* argv[]) { // Parse command line arguments if (argc < 2) { printf("Usage: %s <number1> <number2> ... <numberN>\n", argv[0]); return 1; } int count = argc - 1; int* numbers = malloc(count * sizeof(int)); for (int i = 0; i < count; i++) { numbers[i] = atoi(argv[i + 1]); } // Create worker threads pthread_t threads[5]; thread_args targs = {numbers, count}; pthread_create(&threads[0], NULL, calculate_average, &targs); pthread_create(&threads[1], NULL, calculate_minimum, &targs); pthread_create(&threads[2], NULL, calculate_maximum, &targs); pthread_create(&threads[3], NULL, calculate_median, &targs); pthread_create(&threads[4], NULL, calculate_std_dev, &targs); // Wait for worker threads to complete for (int i = 0; i < 5; i++) { pthread_join(threads[i], NULL); } // Print results printf("The average value is %.2f\n", average); printf("The minimum value is %d\n", minimum); printf("The maximum value is %d\n", maximum); printf("The median value is %.2f\n", median); printf("The standard deviation is %.2f\n", std_dev); // Clean up free(numbers); return 0; } ``` The program takes a list of numbers as command line arguments, creates five worker threads to calculate statistical values, and then outputs the results once the worker threads have completed their calculations. Note that the median calculation uses a simple sorting algorithm to sort the list of numbers first. This may not be efficient for very large lists of numbers, but it works well enough for small lists. Also note that the standard deviation calculation uses the formula for sample standard deviation, which divides by N-1 instead of N to correct for bias.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值