Ссылка на тему 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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
класс решений { общественности : 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 ; } };