Обновление значений вектора при повторении вектора в для каждого цикла

#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 дополнительных недель разработки, которые вам пришлось потратить, чтобы запустить это…)