重复删除奇数索引元素后的最后一个剩余元素
给定一个正整数N ,任务是在重复从序列中删除所有奇数索引元素后打印序列[1, N]中的最后一个剩余元素。
例子:
Input: N = 4
Output: 4
Explanation:
Input: N = 9
Output: 8
朴素方法:解决上述问题的朴素方法是存储序列。迭代序列并从中删除奇数索引元素。重复上述步骤,直到只剩下一个元素。
时间复杂度:O(N logN)
辅助空间:O(1)
有效方法:考虑以下观察:
- 在第一步中,所有奇数元素将被删除,差异为2
- 第二步,所有偶数元素都会被移除,从2开始,相差4
- 第二步,所有偶数元素都会被移除,从4开始,相差8
- 同样,在下一步中,将删除所有差异为16的元素,依此类推。
- 因此,在每一步中,您都可以看到差异为2 X的元素将被移除。
- 在这样做的过程中,除了序列中存在的 2 的最大幂之外,最终将删除所有元素。
根据以上观察,可以得出:
last remaining element (L) = log2 N
下面是上述方法的实现。
C++
#include
#include
using namespace std;
int lastBlock(int N)
{
// finding power of 2 less than or equal N
int largestPower = log2(N);
// returning the last remaining number
return pow(2,largestPower);
}
// Driver code
int main()
{
int N = 10;
cout << lastBlock(N);
return 0;
}
// This code is contributed by maddler.
Java
// Java program for the above approach
import java.io.*;
class GFG {
// Function to find last remaining element
public static int lastBlock(int N) {
// finding power of 2 less than or equal N
int largestPower = (int)(Math.log(N) / Math.log(2));
// returning the last remaining number
return (int)(Math.pow(2, largestPower));
}
// Driver code
public static void main(String[] args)
{
int N = 10;
// Function Call
System.out.println(lastBlock(N));
}
}
// This code is contributed by code_hunt.
Python3
# Python program for above approach.
import math
# Function to find last remaining element
def lastBlock(N):
# finding power of 2 less than or equal N
largestPower = (int)(math.log(N, 2))
# returning the last remaining number
return (int)(math.pow(2, largestPower))
# Driver Code
N = 10
# Function Call
print(lastBlock(N))
C#
// C# program for the above approach
using System;
class GFG {
// Function to find last remaining element
public static int lastBlock(int N) {
// finding power of 2 less than or equal N
int largestPower = (int)(Math.Log(N) / Math.Log(2));
// returning the last remaining number
return (int)(Math.Pow(2, largestPower));
}
// Driver code
public static void Main(String[] args)
{
int N = 10;
// Function Call
Console.Write(lastBlock(N));
}
}
// This code is contributed by shivanisinghss2110
Javascript
输出
8
时间复杂度: O(1)
辅助空间: O(1)