当前位置:网站首页>Written interview questions: find the smallest positive integer missing
Written interview questions: find the smallest positive integer missing
2020-11-08 10:30:00 【osc_redits】
Original published in :

The National Day holiday is over half . today , Let's take a look at one leetcode problem , It was the same year B Interview questions for the company , Difficult . Questions as follows :
Given an array of integers , Find the smallest missing positive integer , The required time complexity is O(n), The space complexity is O(1). The input and output examples are as follows :
| Input array a | Output |
| [1, 2, 0] | 3 |
| [3, 4, 1, -1] | 2 |
| [6, 7, 8, 12] | 1 |

Let's analyze first :
A. hypothesis a Medium n It's full of elements 1~n, Then the missing smallest positive integer is n+1.
B. hypothesis a Medium n The elements are not fully occupied 1~n, Then the missing smallest positive integer must be 1~n Some number between .
comprehensive A and B You know : The missing smallest positive integer must be in the interval [1, n+1] in . This is a very important conclusion .
Algorithm 1: The brute force algorithm
The brute force algorithm is simple , Traversing the interval directly [1, n+1], Then determine whether the element is in a in . here , The time complexity is O(n*n), The space complexity is O(1).
obviously , Can't pass the interview .
Algorithm 2: The hash algorithm
From the violence algorithm we can see that , It's nothing more than a search question , Then consider hash table . That is the a Arrays are recorded in hash tables , And then we traverse the interval directly [1, n+1], You can determine whether the element is in the hash table . here , Time complexity and space complexity are both O(n).
obviously , Can't pass the interview .
Algorithm 3: Clever marking
We refer to Algorithms 2, And make clever optimization when marking the existence of elements .
With a = [3, 4, 1, -1] For example ,n = 4, The process is as follows :
| The original array | [3, 4, 1, -1] |
| Change the non positive number to n+1 | [3, 4, 1, 5] |
| 3 There is , use a[3-1] The negative sign of | [3, 4, -1, 5] |
| 4 There is , use a[4-1] The negative sign of | [3, 4, -1, -5] |
| 1 There is , use a[1-1] The negative sign of | [-3, 4, -1, -5] |
| a[x-1]=4, Positive number , so x There must not be | x=2 Is the missing smallest positive integer |
You can see , In the record element x If it exists , It uses a[x - 1] The symbol of , among ,x The interval of is [1, n]. The time complexity of the algorithm is O(n), The space complexity is O(1), It fully meets the requirements of the topic . This kind of marking is very clever , And it's really not easy to think of .
Now that the steps of the algorithm are determined , So the corresponding program is relatively simple , Take a look at :
package main
import "fmt"
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
func solution(a []int) int {
n := len(a)
for i := 0; i < n; i++ {
if a[i] <= 0 {
a[i] = n + 1
}
}
for i := 0; i < n; i++ {
num := abs(a[i])
if num <= n {
a[num - 1] = -abs(a[num - 1])
}
}
for i := 0; i < n; i++ {
if a[i] > 0 {
return i + 1
}
}
return n + 1
}
func main() {
a := []int{3, 4, 1, -1}
fmt.Println(solution(a))
}
result :2
Algorithm 4: Displacement and homing
Algorithm 3 It's hard to think of , So let's look at more intuitive ideas . For arrays a The elements of i, If i In the interval [1, n] in , Can be returned by replacement , hold i Put it in a[i-1] It's about , as follows :
| Input array a | Replace the goal |
| [1, 2, 0] | [1, 2, 0] |
| [3, 4, 1, -1] | [1, -1, 3, 4] |
| [6, 7, 8, 12] | [6, 7, 8, 12] |
After replacement , Traverse... Again a, If a[x-1] and x It's not equal , that ,x It must be the missing smallest positive integer , as follows :
| Replace the goal | x( The missing smallest positive integer ) |
| [1, 2, 0] | 3 |
| [1, -1, 3, 4] | 2 |
| [6, 7, 8, 12] | 1 |
The time complexity of the algorithm is O(n), The space complexity is O(1), It fully meets the requirements of the topic . Now that the algorithm is determined , So the corresponding program is relatively simple , as follows :
package main
import "fmt"
func solution(a []int) int {
n := len(a)
for i := 0; i < n; i++ {
// Be careful : Here we're going to use for, instead of if.
for a[i] > 0 && a[i] <= n && a[a[i]-1] != a[i] {
a[a[i]-1], a[i] = a[i], a[a[i]-1]
}
}
for i := 0; i < n; i++ {
if a[i] != i + 1 {
return i + 1
}
}
return n + 1
}
func main() {
a := []int{3, 4, 1, -1}
fmt.Println(solution(a))
}
result :2
in summary : Algorithm 1 Sum algorithm 2 Can't pass the interview , Algorithm 3 Sum algorithm 4 You can go through an interview . among , Algorithm 3 It's rather winding , It's not easy to think of . By comparison , Algorithm 4 Intuitive and easy to understand , In the implementation of the program to pay attention to the inner layer to use for, instead of if.
overall ,B The company's interview requirements are still very high , I wish you all the best offer.
版权声明
本文为[osc_redits]所创,转载请带上原文链接,感谢
边栏推荐
- Installing MacOS 11 Big Sur in virtual machine
- 游戏优化性能杂谈(十一) - 知乎
- TCP协议如何确保可靠传输
- [computer network] learning notes, Part 3: data link layer (Xie Xiren version)
- Adobe Lightroom /Lr 2021软件安装包(附安装教程)
- SQL Server 2008R2 18456 error resolution
- Visual studio 2015 unresponsive / stopped working problem resolution
- 软件测试就是这么回事?!
- “1024”征文活动结果新鲜出炉!快来看看是否榜上有名?~~
- How does spotify drive data-driven decision making?
猜你喜欢

PCIe enumeration process

Flink的sink实战之一:初探

Bohai bank million level fines continue: Li Volta said that the governance is perfect, the growth rate is declining

比Python快20%,就问你兴不兴奋?

学习小结(关于深度学习、视觉和学习体会)

i5 1135g7和i5 1035g1参数对比区别大吗? 哪个好

python_scrapy_房天下
![[computer network] learning notes, Part 3: data link layer (Xie Xiren version)](/img/b0/b236a52e38f1cd3eff25a398dac7aa.jpg)
[computer network] learning notes, Part 3: data link layer (Xie Xiren version)

你搞不懂与别人的差距,永远成不了架构师!月薪15K和月薪65K,你差在那了?

Daily challenges of search engines_ 4_ External heterogeneous resources - Zhihu
随机推荐
Seven features of Python 3.9
计算机网络基本概念(五)局域网基本原理
Architect (November 2020)
VC + + specified directory file output by time
墨者学院SQL注入解题
Python3.9的7个特性
Review the cloud computing application scenarios you didn't expect (Part 1)
C语言I博客作业03
python 循环区分(while循环和for循环)
Px4 adds new applications
vivoS7e和vivoS7的区别 哪个更值得入手
Improvement of rate limit for laravel8 update
笔试面试题目:判断单链表是否有环
抖音直播监控Api:随机推荐
Application of bidirectional LSTM in outlier detection of time series
Julia 是如何风靡起来的?
laravel8更新之速率限制改进
Function periodic table filter value selectedvalue
Adobe Lightroom /Lr 2021软件安装包(附安装教程)
vivoy73s和荣耀30青春版的区别