1133. Largest Unique Number
1 | class Solution { |
这个解法还挺有意思. 先sort一下, 然后从后往前遍历, 因为我们是找最大的. 如果是找最小的, 我们就从前往后遍历即可. 如果nums[i] == nums[i - 1], 那么这个nums[i]对应的数字就不行, 我们就用个循环把等于nums[i]的数字全部跳过. 等到到了一个位置发现nums[i] != nums[i - 1]的时候. 我们就可以停了, 此时nums[i - 1]就是一个新的数字. 由于我们使用nums[i - 1], 我们必须保证i - 1不能出界. 因此开始在判断nums[i - 1]等不等于nums[i]的时候, 我们要加一个条件就是i要大于0. 同样我们跳过相同数字的时候, 也要保证i大于0. 因此我们就在想, 如果跳过相同数字的时候, 刚好连续到了i == 0处, 那么我们会停止循环, 然后i–, 此时外侧for循环就不会再继续. 如果没有到i == 0处, 我们i–, 此时的位置就是下一个新数字的位置. 此时如果i == 0了, 因为它前面没数字了, 因此i == 0处的数字就是max, 如果此时的i > 0, 我们继续看它之前有没有重复数字, 这就是第6行的来历. 等于是先确定怎么跳过重复数字, 再看while结束时, i的位置, 然后根据不同情况判断下一步怎么做. 这个挺有意思的.
时间复杂度: O(nlogn)
空间复杂度: O(logn)
1 | class Solution { |
第二种方法就是HashMap, 很常规.
时间复杂度: O(n)
空间复杂度: O(n)