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

หาค่าสูงสุดในอาร์เรย์ที่เรียงแล้วและหมุน (Sorted and Rotated Array) ใน C++

คำอธิบาย

กำหนดอาร์เรย์ที่เรียงลำดับแล้วขององค์ประกอบที่ไม่ซ้ำกัน ซึ่งถูกหมุน (rotated) ที่จุดที่ไม่ทราบ งานคือการหาค่าสูงสุดในอาร์เรย์

ตัวอย่าง

ถ้าอาร์เรย์นำเข้าคือ {30, 40, 50, 10, 20} ค่าสูงสุดคือ 50

อัลกอริทึม

  • ค่าสูงสุดคือองค์ประกอบเพียงตัวเดียวที่องค์ประกอบถัดไปของมันมีค่าน้อยกว่า ถ้าไม่มีองค์ประกอบถัดไปที่น้อยกว่า แสดงว่าไม่มีการหมุน นั่นคือองค์ประกอบสุดท้ายคือค่าสูงสุด
  • เราตรวจสอบเงื่อนไขนี้สำหรับองค์ประกอบกลาง (middle element) โดยเปรียบเทียบกับองค์ประกอบที่ mid – 1 และ mid + 1 ถ้าค่าสูงสุดอยู่กับองค์ประกอบที่ mid – 1 และ mid + 1 ถ้าค่าสูงสุดไม่อยู่ตรงกลาง (ไม่ใช่ mid และไม่ใช่ mid + 1) แล้ว ค่าสูงสุดจะอยู่ในครึ่งซ้ายหรือครึ่งขวา:
    • ถ้าองค์ประกอบกลางมากกว่าองค์ประกอบสุดท้าย ค่าสูงสุดจะอยู่ในครึ่งซ้าย
    • มิฉะนั้น ค่าสูงสุดจะอยู่ในครึ่งขวา

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

#include <bits/stdc++.h> using namespace std; int getMaxinSortedAndRorated(int *arr, int low, int high) {    if (high < low) {       return arr[0];    }    if (high == low) {       return arr[high];    }    int mid = low + (high - low) / 2;    if (mid < high && arr[mid + 1] < arr[mid]) {       return arr[mid];    }    if (mid > low && arr[mid] < arr[mid - 1]) {       return arr[mid - 1];    }    if (arr[low] > arr[mid]) {       return getMaxinSortedAndRorated(arr, low, mid - 1);    } else {       return getMaxinSortedAndRorated(arr, mid + 1, high);    } } int main() {    int arr[] = {30, 40, 50, 10, 20};    int n = sizeof(arr) / sizeof(arr[0]);    cout << "Maximum element = " << getMaxinSortedAndRorated(arr, 0, n - 1) << endl;    return 0; }

ผลลัพธ์

เมื่อคอมไพล์และรันโปรแกรมด้านบน จะได้ผลลัพธ์ดังนี้:

Maximum element = 50