Java-код Leetcode занимает меньше времени, чем код C++ [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Java-код Leetcode занимает меньше времени, чем код C++ [закрыто]

Сообщение Anonymous »

Я решал вопрос https://leetcode.com/problems/set-matri ... bmissions/ по leetcode и придумал Java-решение, выполнение которого заняло 1 мс. Когда я преобразовал его в код C++, время выполнения увеличилось до 12 мс. Почему это так.
Ниже приведены два кода (я не слишком хорошо разбираюсь в C++ и новичком использую Java).
JAVA-КОД

Код: Выделить всё

class Solution {
private void setZero(int[][] matrix, int i, int j, boolean row[], boolean col[]){
if(!row[i]){
row[i] = true;
for(int k = 0; k < matrix[0].length; k++)   matrix[i][k] = 0;
}
if(!col[j]){
col[j] = true;
for(int k = 0; k < matrix.length; k++)   matrix[k][j] = 0;
}
}
public void setZeroes(int[][] matrix) {
ArrayList coords = new ArrayList();

boolean[] row = new boolean[matrix.length], col = new boolean[matrix[0].length];
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == 0){
ArrayList arr = new ArrayList();
arr.add(i);
arr.add(j);
coords.add(arr);
}
}
}

for(int i = 0; i < coords.size(); i++){
ArrayList arr = coords.get(i);
setZero(matrix, arr.get(0), arr.get(1), row, col);
}
}
}
КОД C++

Код: Выделить всё

class Solution {
private:
void setZero(std::vector& matrix, int i, int j, std::vector& row, std::vector& col) {
if (!row[i]) {
row[i] = true;
for (int k = 0; k < matrix[0].size(); k++)
matrix[i][k] = 0;
}
if (!col[j]) {
col[j] = true;
for (int k = 0; k < matrix.size(); k++)
matrix[k][j] = 0;
}
}
public:
void setZeroes(std::vector& matrix) {
std::vector coords;

std::vector row(matrix.size(), false), col(matrix[0].size(), false);
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == 0) {
coords.push_back({i, j});
}
}
}

for (int i = 0; i < coords.size(); i++) {
std::vector arr = coords[i];
setZero(matrix, arr[0], arr[1], row, col);
}
}
};
Неправильно ли я реализовал код на C++ или это означает, что мне следует использовать C++ вместо DSA, так как это поможет мне понять, как писать более оптимизированный код (1 мс в Java составляет 12 мс) в C++, поэтому, возможно, 0 мс в C++ могут быть более оптимизированы, чем 0 мс в Java).
Изменить:
Вопрос дал нам 2D-матрицу с числовыми элементами.
Если элемент в позиции матрицы[j] равен 0, то нам нужно сделать всю строку i и столбец j нулевыми.
пример ->

Код: Выделить всё

1 2 3 5
3 0 2 6
3 4 5 0
выше приведен ноль в позициях 1,1 и 2, 3
шаг 1-> установить нулевую строку 1 и столбец 1
1 0 3 5
0 0 0 0
3 0 5 0
шаг 2-> установить нулевую строку 2 и столбец 3

Код: Выделить всё

1 0 3 0
0 0 0 0
0 0 0 0
Используемые переменные:
coords — это arrayList из arrayList, который используется для хранения координат всех нулевых элементов в матрице (например, если мы обновляем элементы по ходу дела). на первом этапе мы будем считать элементы, изначально ненулевые, нулевыми и получим неправильный ответ).
row и col — это логические массивы, позволяющие узнать, было ли уже установлено значение для конкретной строки/столбца. 0, если да, то мы не устанавливаем его снова в ноль (удаляя избыточность)
Алгоритм->
  • Найти все координаты нулевых элементов в исходной матрице
  • Используйте метод setZero с параметром i, j, row и col.
  • если row/col уже установлен в ноль ничего не делайте
  • иначе убедитесь, что каждый элемент в соответствующей строке/столбце равен нулю.
  • повторите это для каждого элемента в координатах.
    6. end
Моя основная проблема заключается в том, что один и тот же код занимает 1 мс в Java, но 12 мс в C++ (хотя есть коды со временем выполнения от 0 мс до 12 мс), поэтому означает ли это, что если я использую C++, я увижу большую разницу во времени выполнения для небольших изменений (то есть небольших изменений, которые не окажут влияния на время выполнения Java, но на самом деле они лучше, поэтому будут показаны различия в C++, но не в Java. То есть, если я использую C++, я смогу лучше понять, какое решение является более оптимальным, даже если время выполнения в Java кажется таким же.

Подробнее здесь: https://stackoverflow.com/questions/782 ... han-c-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»