LeetCode 665: Azalmayan Dizi

Nov 05 2020

LeetCode'un "Azalmayan Dizisi" için bir çözüm yayınlıyorum. İncelemek isterseniz, lütfen yapın. Teşekkür ederim!

Sorun

Bir dizi Verilen numsile ntamsayılar, görev en 1 eleman olarak değiştirerek olmayan azalan haline gelebilir olmadığını kontrol etmektir.

nums[i] <= nums[i + 1]Her i (0 tabanlı) için ( 0 <= i <= n - 2) gibi tutarsa, azalmayan bir dizi tanımlarız .

Örnek 1:

  • Giriş: nums = [4,2,3]
  • Çıktı: doğru
  • Açıklama: Azalan bir dizi elde etmek için ilk 4'ü 1'e değiştirebilirsiniz.

Örnek 2:

  • Giriş: nums = [4,2,1]
  • Çıktı: yanlış
  • Açıklama: En fazla bir elemanı değiştirerek azalan bir dizi elde edemezsiniz.

Kısıtlamalar:

  • 1 <= n <= 10 ^ 4
  • -10 ^ 5 <= nums[i] <= 10 ^ 5

Kod

// Most of headers are already included;
// Can be removed;
#include <iostream>
#include <cstdint>
#include <vector>

// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

struct Solution {
    using ValueType = std::int_fast32_t;
    static const bool checkPossibility(
        std::vector<int>& nums
    ) {

        if (std::size(nums) < 3) {
            return true;
        }

        ValueType max_changes = 0;

        for (ValueType index = 1; max_changes < 2 && index < std::size(nums); ++index) {
            if (nums[index - 1] > nums[index]) {
                ++max_changes;

                if (index - 2 < 0 || nums[index - 2] <= nums[index]) {
                    nums[index - 1] = nums[index];

                } else {
                    nums[index] = nums[index - 1];
                }
            }
        }

        return max_changes < 2;
    }
};


int main() {
    std::vector<int> nums = {3, 4, 2, 3};
    std::cout << std::to_string(Solution().checkPossibility(nums) == false) << "\n";
    return 0;
}

Yanıtlar

2 G.Sliepen Nov 05 2020 at 05:34

Gereksiz özel durum işlemlerinden kaçının

Dizinin boyutu 3'ten küçükse erken çıkarsınız, ancak bu gereksizdir: kodun geri kalanı zaten boyut 0, 1 ve 2 dizilerini doğru şekilde işler. Küçük bir dizi beslerseniz bir döngüden tasarruf edebilirsiniz, ancak bu çeki, işlev std::size(nums)> 2 ile her çağrıldığında bir veya iki döngü ile ödersiniz .

std::size_tEndeksler için kullanın

Sen yapılmış indexbir std::int_fast32_t, ama bu farklı bir boyut (büyük olasılıkla) ve sonucu daha farklı signedness sahiptir std::size(nums). Bu, derleyicinin sizi işaretli ve işaretsiz tamsayılar arasında bir karşılaştırma konusunda uyarmış olması gerektiği anlamına gelir. Burada işler yolunda giderken, girdi dizisinin boyutunun kısıtlı olduğunu bildiğiniz std::size_tiçin, derleyici uyarısından kaçınmak için burada kullanmak en iyisidir . indexHer zaman bir CPU kaydında tutulabileceğinden , performans muhtemelen bir bit farklı olmayacaktır.

Kullanmaya gerek yoktur std::to_string()kullanırken <<a üzerindestd::ostream

Bir yazarken std::ostream, operator<<zaten bu yüzden çağrısına gerek yoktur, argüman biçimlendirilmiş neden olacaktır std::to_string(). Aslında, akışa a'yı boolmetin olarak biçimlendirmesini söyleyebilirsiniz :

int main() {
    std::vector<int> nums = {3, 4, 2, 3};
    std::cout << std::boolalpha << Solution().checkPossibility(nums) << "\n";
}