簡體   English   中英

找到數組中最大的 n 個元素

[英]find the n largest elements in an array

我有一個數組,我需要在數組中找到 n 個平局,例如{1,2,3,3}我需要程序返回兩個 3

void print_winner(void)
{
    // TODO
    string arr[9];
    string name = "";
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest<candidates[i].votes)
        {
            largest = candidates[i].votes;
            name = candidates[i].name;
        }

    }

    // arr[0] = name;
    printf("%s\n", name);
    return;
}

在這段代碼中,候選人是一個具有兩個屬性的結構:名稱和投票我需要程序打印投票數最高的名稱,即使有 3 路平局

我在想我會遍歷列表找到最大的 int,然后刪除該 int 並再次遍歷列表以查看是否有任何元素等於原始列表中的最大元素,如果是,則將名稱添加到數組中,最后打印所有名字)

通常好的編程方法是將問題分解並解決其單獨的部分。

在這種情況下,設置問題的一種方法是打印所有得分最高的人的姓名。 但這個問題有些復雜。

設置問題的另一種方法如下:

  • 找到最高分。
  • 找到最高分后,打印所有得分最高的人的姓名。

這些子問題中的每一個都更容易,並且應該一起解決問題。

我更喜歡教別人如何釣魚,所以我不想通過在代碼中為你實現解決方案來破壞或破壞你學習、改進和變得很棒的機會。 非常歡迎您要求澄清,但是,我非常願意提供幫助:)。

我認為你只需要在找到具有最大票數的候選人后再次循環數組,以查找是否有其他候選人或更多候選人具有相同的否。 票數。無需刪除記錄。

直到你通過了每一個計票,你才知道largest的計票。 當找到一個真正更大的largest時,需要更正當前最大值的名稱。 這樣做:

void print_winner_1(void)
{
    // globals: candidates: array
    //          voter_count: size of array

    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest < candidates[i].votes)
        {
            largest = candidates[i].votes;
        }

    }
    for (int i = 0; i < voter_count; i++)
    {
        if (largest == candidates[i].votes)
        {
            printf("%s\n", candidates[i].name);
        }

    }
}

上面可以存儲一個最大的largest_first_i ,以提高速度。

完整收集中間結果:

void print_winner_2(void)
{
    // globals: candidates: array
    //          voter_count: size of array

    string names[9]; // Tie names.
    int name_count = 0;
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest < candidates[i].votes)
        {
            name_count = 0; // Reset list of ties.
            largest = candidates[i].votes;
        }
        if (largest == candidates[i].votes)
        {
            if (name_count == 9) { // More than 9 temporary (!) ties.
                print_winner_1();
                return;
            }
            names[name_count++] = candidates[i].name;
        }

    }
    for (int i = 0; i < name_count; i++)
    {
        printf("%s\n", names[i]);
    }
}

我做了一個有兩個完整的循環,一個立即收集領帶。 第二種解決方案容易導致結果數組溢出(如果有超過 9 個候選者),比如說在[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23]的情況下,第一個中間關系會最大溢出 == 0。

第二個也不需要更快,因為您需要存儲到names中並且每次增加largest 幾乎是過早優化的情況。

查找m * m(2 &lt;= m

[英]Find a subarray of m*m (2<=m<n) having largest sum; out of an n*n int array(having +ve, -ve, 0s)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM