#c #algorithm
Вопрос:
Я делаю код 322,использую coin <= numeric_limits<int>::max()
вместо coin < numeric_limits<int>::max()
того, чтобы уменьшить 12 мс, но я не могу понять, почему?
решение на 64 мс:
class Solution {
public:
int coinChange(vector<int>amp; coins, int amount) {
vector<int> dp(amount 1, numeric_limits<int>::max());
dp[0] = 0;
for(int i = 0; i <= amount; i){
if(dp[i] != numeric_limits<int>::max())
for(const auto amp;coin : coins){
if(coin <= numeric_limits<int>::max() - i amp;amp; i coin <= amount)
dp[i coin] = min(dp[i coin], dp[i] 1);
}
}
return dp[amount] == numeric_limits<int>::max() ? -1 : dp[amount];
}
};
решение 76ms:
class Solution {
public:
int coinChange(vector<int>amp; coins, int amount) {
vector<int> dp(amount 1, numeric_limits<int>::max());
dp[0] = 0;
for(int i = 0; i <= amount; i){
if(dp[i] != numeric_limits<int>::max())
for(const auto amp;coin : coins){
if(coin < numeric_limits<int>::max() - i amp;amp; i coin <= amount)
dp[i coin] = min(dp[i coin], dp[i] 1);
}
}
return dp[amount] == numeric_limits<int>::max() ? -1 : dp[amount];
}
};
Комментарии:
1. Разница в 12 мс, скорее всего, будет вызвана случайным совпадением.
2. Тайминги, о которых сообщает Leetcode, слабо коррелируют с фактической производительностью; время суток является лучшим предиктором отображаемой среды выполнения. При повторном запуске ваших 2 образцов кода эффект был обратным: я получил 115 мс и 87 мс. Я бы рекомендовал использовать вашу собственную машину для сравнительного анализа; в противном случае скептически относитесь ко всему, что ниже огромной разницы во времени (аддитивной и мультипликативной) с удаленного интернет-сервера, о котором у вас мало информации.
3. если вы хотите создать код микробенчмарка, а) сделайте это локально б) используйте библиотеку, предназначенную для этого (которая будет запускать код много раз и т.д.) в) имейте в виду, что микробенчмарк очень сложен, так как компиляторы все более умны в оптимизации кода (а также случайные вещи, выполняемые на вашей машине, могут повлиять на время, например, проверка на антивирус или что-либо еще)