03 начертано: дублированный цифровой массив (C ++)

Ссылка на тему https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

Название Описание

Найти множество повторяющихся чисел.
Все числа в массиве длиной НУМСА п находятся в диапазоне от 0 ~ п-1. Некоторый цифровой массив дублируется, но не знает , сколько чисел Повторяет, не знает , каждый номер был повторен несколько раз. Вы можете найти массив любого из повторяющихся чисел.

примеров

Входные данные : [2, 3, 1, 0, 2, 5, 3]
Выход: 2 или 3

Проблема решения идеи

Через массив и делает обмен по значению индекса корреспонденции, (то есть  nums[i] = i ), так что можно найти соответствующие значения индекса. При обходе массиву каждый раз , когда он сталкивается с новыми номерами индекса я в НУМС [я], который индексированные к обмену Nums Nums [я] к [Nums [я]] в. При прохождении встречи повтор число я, там должен НУМС [я] == я (я столкнулся , потому что сначала он должен обменять Nums [я] в а), таким образом , чтобы получить набор повторяющихся чисел ,

Исходный код программы

Метод 1

класс решений {
 общественности :
     INT findRepeatNumber (вектор < INT > & НУМС) {
         если (nums.empty ()) возвращение  0 ; 
        unordered_set < INT > s;
        для ( Int I = 0 , я <nums.size (); я ++ ) 
        { 
            если (s.count (НУМС [I])> 0 ) возврата НУМС [I]; 
            s.insert (НУМС [I]); 
        } 
        Возвращает  0 ; 
    } 
};
Просмотр кода

Способ 2

класс решений {
 общественности :
     INT findRepeatNumber (вектор < INT > & НУМС) {
         если (nums.empty ()) возвращение - 1 ;
        для ( междунар я = 0 , я <nums.size (); я ++ ) 
        { в 
            то время как (! НУМС [я] = я) 
            { 
                если (Nums [я] == НУМС [НУМС [я]])
                     возвращение НУМС [я] ;
                остальное  
                    своп (НУМС [I], [НУМС НУМС [I]]); 
            } 
        } 
        Возвращение -1 ; 
    } 
};

 

рекомендация

отwww.cnblogs.com/wzw0625/p/12501935.html