给定一个整数N,代表一个圆圈中的N个人,则任务是找到一个人按顺时针方向杀死紧邻的邻居时剩下的最后2个人。
例子:
Input: N = 5
Output: 1 4
Explanation:
Initially: 1 2 3 4 5
=> 1 kills 3
Standing: 1 2 4 5
=> 2 kills 5
Standing: 1 2 4
=> 4 kills 2
Final Standing: 1 4
Input: N = 2
Output: 1 2
天真的方法:一种简单的方法是保持大小为N的布尔数组来跟踪一个人是否还活着。
- 最初,布尔数组对所有人都是正确的。
- 保留两个指针,一个指向当前在世的人,第二个指向存储先前的当前人。
- 一旦找到当前人的第二个活着的邻居,请将其布尔值更改为false。
- 然后,当前电流再次从前一个更新为下一个。
- 这个过程将持续到最后两个人幸免。
时间复杂度: O(N 2 )
辅助空间: O(N)
高效的方法:一种有效的方法是将人(如果已死亡)从数据结构中移出,以使其不再被遍历。
- 仅在完成一轮比赛后,最多只有N / 2人。
- 然后,在下一轮中将剩下N / 4人,依此类推,直到有很多在世的人变成2人为止。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Node for a Linked List
struct Node {
int val;
struct Node* next;
Node(int _val)
{
val = _val;
next = NULL;
}
};
// Function to find the last 2 survivors
void getLastTwoPerson(int n)
{
// Total is the count
// of alive people
int total = n;
struct Node* head = new Node(1);
struct Node* temp = head;
// Initiating the list of n people
for (int i = 2; i <= n; i++) {
temp->next = new Node(i);
temp = temp->next;
}
temp->next = head;
temp = head;
struct Node* del;
// Total != 2 is terminating
// condition because
// at last only two-person
// will remain alive
while (total != 2) {
// Del represent next person
// to be deleted or killed
del = temp->next->next;
temp->next->next
= temp->next->next->next;
temp = temp->next;
free(del);
total -= 1;
}
// Last two person to
// survive (in any order)
cout << temp->val << " "
<< temp->next->val;
}
// Driver code
int main()
{
int n = 2;
getLastTwoPerson(n);
return 0;
}
Java
// Java implementation of the approach
class GFG{
// Node for a Linked List
static class Node
{
int val;
Node next;
Node(int _val)
{
val = _val;
next = null;
}
};
// Function to find the last 2 survivors
static void getLastTwoPerson(int n)
{
// Total is the count
// of alive people
int total = n;
Node head = new Node(1);
Node temp = head;
// Initiating the list of n people
for(int i = 2; i <= n; i++)
{
temp.next = new Node(i);
temp = temp.next;
}
temp.next = head;
temp = head;
Node del;
// Total != 2 is terminating
// condition because
// at last only two-person
// will remain alive
while (total != 2)
{
// Del represent next person
// to be deleted or killed
del = temp.next.next;
temp.next.next = temp.next.next.next;
temp = temp.next;
del = null;
System.gc();
total -= 1;
}
// Last two person to
// survive (in any order)
System.out.print(temp.val + " " +
temp.next.val);
}
// Driver code
public static void main(String[] args)
{
int n = 2;
getLastTwoPerson(n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 implementation of the approach
# Node for a Linked List
class newNode:
def __init__(self, val):
self.val = val
self.next = None
# Function to find the last 2 survivors
def getLastTwoPerson(n):
# Total is the count
# of alive people
total = n
head = newNode(1)
temp = head
# Initiating the list of n people
for i in range(2, n + 1, 1):
temp.next = newNode(i)
temp = temp.next
temp.next = head
temp = head
de = None
# Total != 2 is terminating
# condition because
# at last only two-person
# will remain alive
while (total != 2):
# de represent next person
# to be deeted or killed
de = temp.next.next
temp.next.next = temp.next.next.next
temp = temp.next
del de
total -= 1
# Last two person to
# survive (in any order)
print(temp.val, temp.next.val)
# Driver code
if __name__ == '__main__':
n = 2
getLastTwoPerson(n)
# This code is contributed by SURENDRA_GANGWAR
C#
// C# implementation of the approach
using System;
class GFG{
// Node for a Linked List
class Node
{
public int val;
public Node next;
public Node(int _val)
{
val = _val;
next = null;
}
};
// Function to find the last 2 survivors
static void getLastTwoPerson(int n)
{
// Total is the count
// of alive people
int total = n;
Node head = new Node(1);
Node temp = head;
// Initiating the list of n people
for(int i = 2; i <= n; i++)
{
temp.next = new Node(i);
temp = temp.next;
}
temp.next = head;
temp = head;
Node del;
// Total != 2 is terminating
// condition because
// at last only two-person
// will remain alive
while (total != 2)
{
// Del represent next person
// to be deleted or killed
del = temp.next.next;
temp.next.next = temp.next.next.next;
temp = temp.next;
del = null;
total -= 1;
}
// Last two person to
// survive (in any order)
Console.Write(temp.val + " " +
temp.next.val);
}
// Driver code
public static void Main(String[] args)
{
int n = 2;
getLastTwoPerson(n);
}
}
// This code is contributed by Amit Katiyar
输出:
1 2
时间复杂度: O(N * log N)
辅助空间: O(N)