Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เขียนโปรแกรม C++ เพื่อหาค่าสูงสุดและค่าสูงสุดอันดับสองในอาร์เรย์จำนวนเต็มที่ไม่ได้เรียงลำดับ

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่ไม่ได้เรียงลำดับขนาด N งานคือหาองค์ประกอบ max และ second max ที่แตกต่างกันซึ่งมีอยู่ในอาร์เรย์ อาร์เรย์อาจมีองค์ประกอบซ้ำกันด้วย ดังนั้นเราต้องหาเฉพาะองค์ประกอบที่แตกต่างกัน ตัวอย่างเช่น

ตัวอย่างอินพุต 1

N = 5, A[] = {2, 2, 1, 3, 4}

เอาต์พุต

4 3

คำอธิบาย

จากอาร์เรย์ที่กำหนด เราสามารถเห็นได้ว่า '4' คือค่าสูงสุดและ '3' คือค่าสูงสุดอันดับสอง

ตัวอย่างอินพุต 2

N = 4, A[] = {1, 3, 3, 2}

เอาต์พุต

3 2

คำอธิบาย

จากอาร์เรย์ที่กำหนดขนาด 4 เราสามารถเห็นได้ว่า '3' คือค่ามากที่สุดและ '2' คือค่ามากอันดับสอง ดังนั้นเราจะคืนค่า 3 2 เป็นเอาต์พุต

วิธีการแก้ปัญหา

ในอาร์เรย์ขนาด N ที่กำหนด อาจมีองค์ประกอบซ้ำกันด้วย เพื่อหาองค์ประกอบสูงสุดและสูงสุดอันดับสองจากอาร์เรย์ เราสามารถเริ่มต้นตัวแปรสองตัวที่เก็บค่าสูงสุดและสูงสุดอันดับสองได้

เริ่มต้น ถ้าองค์ประกอบปัจจุบันมากกว่าค่าสูงสุด เราจะเก็บค่าของมันไว้ที่ค่าสูงสุดและค่าของค่าสูงสุด (ก่อนหน้า) ไว้ที่ค่าสูงสุดอันดับสอง

เพื่อหาองค์ประกอบที่แตกต่างกัน เราจะตรวจสอบว่าองค์ประกอบปัจจุบันเท่ากับค่าสูงสุดหรือไม่ ถ้าค่าปัจจุบันไม่เท่ากับค่าสูงสุดและมากกว่าค่าสูงสุดอันดับสอง เราจะแทนที่ค่าก่อนหน้าของค่าสูงสุดอันดับสองด้วยค่าปัจจุบัน

  • เริ่มต้นและรับอินพุตขนาด N ของอาร์เรย์
  • ฟังก์ชัน maxAndSecondMax(int arr[], int size) รับอาร์เรย์เป็นอินพุตและขนาดของอาร์เรย์ ซึ่งคืนค่าองค์ประกอบ max และ second max ของอาร์เรย์ที่กำหนด
  • วนลูปผ่านองค์ประกอบอาร์เรย์และหาว่าถ้าองค์ประกอบปัจจุบันมากกว่าค่าสูงสุด ให้เก็บค่าปัจจุบันไว้ที่ค่าสูงสุดและค่าก่อนหน้าของค่าสูงสุดกับค่าสูงสุดอันดับสอง
  • มิฉะนั้น ถ้าค่าปัจจุบันมากกว่าค่าสูงสุดอันดับสอง ให้แทนที่ค่าก่อนหน้าด้วยค่าปัจจุบัน นอกจากนี้ ค่าปัจจุบันไม่ควรเท่ากับค่าสูงสุด
  • ตรวจสอบว่าค่าสูงสุดอันดับสองไม่มีค่าใดๆ
  • คืนค่าค่าสูงสุดและค่าสูงสุดอันดับสองเป็นเอาต์พุทสุดท้าย

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

void maxAndSecondMax(int *arr, int size) {
    int max = INT_MIN;
    int s_max = INT_MIN;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i] > max) {
            s_max = max;
            max = arr[i];
        } else if (arr[i] > s_max && arr[i] != max) {
            s_max = arr[i];
        }
    }
    
    if (s_max == INT_MIN) {
        s_max = -1;
    }
    cout << max << " " << s_max;
}

int main() {
    int N = 6;
    int A[N] = {1, 3, 2, 5, 6, 3};
    maxAndSecondMax(A, N);
    return 0;
}

ผลลัพธ์

ถ้าเราจะรันโค้ดด้านบน จะพิมพ์เอาต์พุตเป็น

6 5

6 และ 5 เป็นองค์ประกอบที่แตกต่างกันในอาร์เรย์ซึ่งเป็นค่าสูงสุดและค่าสูงสุดอันดับสอง