#c #vector #foreach
Вопрос:
Это решение проблемы с литкодом, в котором мы должны найти наибольшую сумму, кратную 3, из заданного массива https://leetcode.com/problems/greatest-sum-divisible-by-three/. При повторении вектора во втором цикле foreach, что используется vector<int>(t1)
. Я пытался повторить вектор, for(int j : t1)
но это дает неправильные результаты, в то время как другой подход дает правильный результат.
public:
int maxSumDivThree(vector<int>amp; nums) {
vector<int> t1(3);
for(int a : nums){
//for(int j : t1){
for(int j: vector<int>(t1)){
t1[(a j)%3] = max(t1[(a j)%3], a j);
}
}
return t1[0];
}
};
Комментарии:
1.
for(int j: vector<int>(t1))
создает временную копию t1 в цикле, по которому выполняется итерация. Временная копияvector<int>(t1)
содержит значения предыдущей итерации внешнего цикла (или свежий вектор с0
s в первой итерации), в то время как внутренний цикл записывает обратноt1
.2. @Scheff’Scat: Что бы вы предложили? лучшие имена переменных, комментарии или добавление еще нескольких шагов между ними?
3. Да, да и еще раз да. 🙂
4. В древние времена было искусством писать наиболее сжатый код (особенно на языке Си). Это дало наилучшую производительность при наименьшей удобочитаемости. Теперь (30 лет спустя) компиляторы стали чертовски изощренными в оптимизации. Даже код школьного учебника может быть превращен в эффективный результат. Это окупается меньшими затратами на техническое обслуживание. (Часто 2 … 3 микросекунды во время выполнения не стоят 3 дополнительных недель разработки, которые вам пришлось потратить, чтобы запустить это…)