Содержание этого раздела
Скажите перед чисткой
В дальнейшем помимо кода и того, что хочу сказать , буду сокращать длину статьи,
Потому что слишком много времени тратится на написание статей!
На самом деле вопросы решать не сложно, а сложность в настойчивости!
Эта колонка является классической темой «Предложения Цзяньчжи».
И записывайте свое понимание и процесс обучения в этом блоге !
Введение в тему (ССЫЛКА)
Что касается темы, то особо вводить не буду, копировать не очень имеет смысл, поэтому просто размещу ссылку здесь!
Ссылка LeetCode: нажмите здесь!
Ссылка NowCoder: нажмите здесь!
ход мысли/идеи
1. Первоначальные мысли / Заключительные мысли
Идея 1: карта
Определите map , используйте отношение отображения < number, number of times> и, наконец, подсчитайте количество вхождений каждого символа ;
Объемная сложность этого метода относительно велика !
Идея 2: Сортировка
Для сортировки число с наибольшим количеством вхождений должно быть в середине .
В это время достаточно напрямую вывести промежуточное значение, но если данный массив не является указанным массивом (количество вхождений не превышает половины),
Просто используйте это!
Затем проверьте , соответствует ли количество вхождений чисел в середине требованиям, что относительно просто!
Идея 3: удалить
Вы можете думать об этой идее как об умно оптимизированном коде!
Целевые данные превышают половину длины массива, тогда для массива мы удаляем два разных числа одновременно, и последнее оставшееся число — это число!
Приведенная выше логика загадочна:
Объясните: установите начальное значение (первый элемент массива), а затем сравните его со следующим значением.Если счетчик тот же ++
, если другой, --
замените начальное значение значением следующего массива.
Концепция такова, "удалить", если они разные , а оставшихся значений будет больше всего !
Это удаление не является удалением в прямом смысле, но оно не идет ни в какое сравнение с ним!
Если осталось два, то эти два одинаковы, что является результатом.На его основе верните последнее оставшееся число или два в исходный массив, пройдите массив и подсчитайте количество вхождений числа, чтобы сделать окончательный суждение .
Если вы все еще не понимаете, просто посмотрите на код, который я написал.Если вы читаете код, вы не сможете позвонить мне в комментариях или отправить мне личное сообщение.Я расскажу вам в большом видео !
Это дополнительный момент о временной сложности: вы можете видеть, что в коде есть два цикла for.Некоторые люди задаются вопросом, равна ли сложность n 2 , но нет, на самом деле они сосуществуют, и сложность по-прежнему равна n !
2. Примечания
В OJ JAVA использует JDK1.8 , но не добавлен пакет, связанный с импортом , поэтому вам нужно импортировать его самостоятельно ;
C++ не требует написания заголовочных файлов, он добавлен по умолчанию!
Код
1. Определить код реализации карты
import java.util.Map;
import java.util.HashMap;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if (array == null || array.length == 0) {
return 0;
}
Map <Integer,Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++) {
if (map.containsKey(array[i])) {
int count = map.get(array[i]);
count++;
map.put(array[i], count);// 找到了,次数+1
}else {
map.put(array[i], 1);// 找不到并记录次数为1
}
if (map.get(array[i]) > array.length / 2) {
// 验证次数
return array[i];
}
}
return 0;
}
}
2. Реализация сортировки
//其实这样子也是可以的,更简单!
import java.util.Arrays;
class Solution {
public int majorityElement(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
//防止给的数组不是规定的数组,可以添加for循环,判断目标的次数!
import java.util.Arrays;
class Solution {
public int majorityElement(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
Arrays.sort(array);// 首先排序数组然后找次数
int target = array[array.length / 2];
int count = 0;// 计数器
for (int i = 0; i < array.length; i++) {
if (target == array[i]) {
count++;
}
}
if (count > array.length / 2) {
return target;
}
return 0;
}
}
3. Контрастный метод удаления
class Solution {
public int majorityElement(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
int target = array[0];//设定初始目标值
int times = 1;//出现次数
for (int i = 1; i < array.length; i++) {
if (times == 0) {
target = array[i];
times = 1;
}else if (target == array[i]) {
times++;
}else {
times--;
}
}
times = 0;
for (int j = 0; j < array.length; j++) {
if (target == array[j]) {
times++;
}
}
return times > (array.length / 2) ? target : 0;
}
}
Спасибо
Во время интервью вы ответили на решения мышления 1 и мышления 2. Интервьюер думает, что вы в порядке, но этого все же недостаточно!
Для сравнения, третий способ интереснее!
Для второго метода:
На самом деле его можно просто написать прямо во время письменного теста, то есть использовать уже готовый (метод сортировки в Карри), потому что он быстрый!
Однако во время интервью вы можете общаться с интервьюером:
Вы можете спросить у интервьюера, хотите ли вы увидеть мою способность к сортировке или другие способности!
Наконец, спасибо за чтение!