给定一个长度为N的数组arr[] ,任务是通过将当前元素的值添加到其任何相邻元素并从当前元素中减去最多一次来最小化非零元素的数量。
例子:
Input: arr[] = { 1, 0, 1, 0, 0, 1 }
Output: 2
Explanation:
Operation 1: arr[0] -> arr[1], arr[] = {0, 1, 1, 0, 0, 1}
Operation 2: arr[2] -> arr[1], arr[] = {0, 2, 0, 0, 0, 1}
Count of non-zero elements = 2
Input: arr[] = { 1, 0, 1, 1, 1, 0, 1 }
Output: 3
Explanation:
Operation 1: arr[2] -> arr[3], arr[] = {1, 0, 0, 2, 1, 0, 1}
Operation 2: arr[4] -> arr[3], arr[] = {1, 0, 0, 3, 0, 0, 1}
Count of non-zero elements = 3
方法:思想是使用贪心算法在每一步贪婪地选择。问题中的关键观察是三个连续的索引 i、j 和 k 只能存在三种可能性,即
- 两个结束索引都有非零元素。
- 任何一个索引都有非零元素。
在上述两种情况下,我们总是可以将值添加到中间元素并减去相邻元素。同样,我们可以贪婪地选择操作并更新数组的元素以最小化非零元素。
下面是上述方法的实现:
C++
// C++ implementation to minimize the
// non-zero elements in the array
#include
using namespace std;
// Function to minimize the non-zero
// elements in the given array
int minOccupiedPosition(int A[], int n)
{
// To store the min pos needed
int minPos = 0;
// Loop to iterate over the elements
// of the given array
for (int i = 0; i < n; ++i) {
// If current position A[i] is occupied
// the we can place A[i], A[i+1] and A[i+2]
// elements together at A[i+1] if exists.
if (A[i] > 0) {
++minPos;
i += 2;
}
}
return minPos;
}
// Driver Code
int main()
{
int A[] = { 8, 0, 7, 0, 0, 6 };
int n = sizeof(A) / sizeof(A[0]);
// Function Call
cout << minOccupiedPosition(A, n);
return 0;
}
Java
// Java implementation to minimize the
// non-zero elements in the array
class GFG{
// Function to minimize the non-zero
// elements in the given array
static int minOccupiedPosition(int A[], int n)
{
// To store the min pos needed
int minPos = 0;
// Loop to iterate over the elements
// of the given array
for (int i = 0; i < n; ++i)
{
// If current position A[i] is occupied
// the we can place A[i], A[i+1] and A[i+2]
// elements together at A[i+1] if exists.
if (A[i] > 0) {
++minPos;
i += 2;
}
}
return minPos;
}
// Driver Code
public static void main(String[] args)
{
int A[] = { 8, 0, 7, 0, 0, 6 };
int n = A.length;
// Function Call
System.out.print(minOccupiedPosition(A, n));
}
}
// This code is contributed by gauravrajput1
Python3
# Python3 implementation to minimize the
# non-zero elements in the array
# Function to minimize the non-zero
# elements in the given array
def minOccupiedPosition(A, n):
# To store the min pos needed
minPos = 0
# Loop to iterate over the elements
# of the given array
i = 0
while i < n:
# If current position A[i] is
# occupied the we can place A[i],
# A[i+1] and A[i+2] elements
# together at A[i+1] if exists.
if(A[i] > 0):
minPos += 1
i += 2
i += 1
return minPos
# Driver Code
if __name__ == '__main__':
A = [ 8, 0, 7, 0, 0, 6 ]
n = len(A)
# Function Call
print(minOccupiedPosition(A, n))
# This code is contributed by Shivam Singh
C#
// C# implementation to minimize the
// non-zero elements in the array
using System;
class GFG {
// Function to minimize the non-zero
// elements in the given array
static int minOccupiedPosition(int[] A, int n)
{
// To store the min pos needed
int minPos = 0;
// Loop to iterate over the elements
// of the given array
for(int i = 0; i < n; ++i)
{
// If current position A[i] is occupied
// the we can place A[i], A[i+1] and A[i+2]
// elements together at A[i+1] if exists.
if (A[i] > 0)
{
++minPos;
i += 2;
}
}
return minPos;
}
// Driver code
static void Main()
{
int[] A = { 8, 0, 7, 0, 0, 6 };
int n = A.Length;
// Function Call
Console.WriteLine(minOccupiedPosition(A, n));
}
}
// This code is contributed by divyeshrabadiya07
Javascript
2
时间复杂度: O(N) 。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。