算法(将所有小于或等于k的元素组合在一起所需的最小交换)

本文概述

  • C ++
  • Java
  • Python3
  • C#
  • 的PHP
给定一个由n个正整数和一个数字k组成的数组。找出将所有小于或等于k的数字放在一起所需的最小交换次数。
Input:arr[] = {2, 1, 5, 6, 3}, k = 3 Output: 1Explanation: To bring elements 2, 1, 3 together, swap element '5' with '3' such that final array will be- arr[] = {2, 1, 3, 6, 5}Input:arr[] = {2, 7, 9, 5, 8, 7, 4}, k = 5 Output: 2

一个简单的解决方案是,首先计算所有小于或等于k的元素(说‘好’)。现在遍历每个子数组,并交换值大于k的元素。这种方法的时间复杂度为O(n^2)
一种简单的方法是使用两个指针技术和滑动窗口。
1)查找所有小于或等于" k"的元素的计数。假设计数是" cnt"
【算法(将所有小于或等于k的元素组合在一起所需的最小交换)】2)对长度为" cnt"的窗口使用两个指针技术, 每次都跟踪该范围内有多少个元素大于" k"。假设总数为"bad"。
3)对每个长度为" cnt"的窗口重复步骤2, 并在其中最少计数为"bad"。这将是最终答案。
C ++
// C++ program to find minimum swaps required // to club all elements less than or equals // to k together #include < iostream> using namespace std; // Utility function to find minimum swaps // required to club all elements less than // or equals to k together int minSwap( int *arr, int n, int k) {// Find count of elements which are // less than equals to k int count = 0; for ( int i = 0; i < n; ++i) if (arr[i] < = k) ++count; // Find unwanted elements in current // window of size 'count' int bad = 0; for ( int i = 0; i < count; ++i) if (arr[i] > k) ++bad; // Initialize answer with 'bad' value of // current window int ans = bad; for ( int i = 0, j = count; j < n; ++i, ++j) {// Decrement count of previous window if (arr[i] > k) --bad; // Increment count of current window if (arr[j] > k) ++bad; // Update ans if count of 'bad' // is less in current window ans = min(ans, bad); } return ans; }// Driver code int main() {int arr[] = {2, 1, 5, 6, 3}; int n = sizeof (arr) / sizeof (arr[0]); int k = 3; cout < < minSwap(arr, n, k) < < "\n" ; int arr1[] = {2, 7, 9, 5, 8, 7, 4}; n = sizeof (arr1) / sizeof (arr1[0]); k = 5; cout < < minSwap(arr1, n, k); return 0; }

Java
// Java program to find minimum // swaps required to club all // elements less than or equals // to k together import java.lang.*; class GFG {// Utility function to find minimum swaps // required to club all elements less than // or equals to k together static int minSwap( int arr[], int n, int k) {// Find count of elements which are // less than equals to k int count = 0 ; for ( int i = 0 ; i < n; ++i) if (arr[i] < = k) ++count; // Find unwanted elements in current // window of size 'count' int bad = 0 ; for ( int i = 0 ; i < count; ++i) if (arr[i] > k) ++bad; // Initialize answer with 'bad' value of // current window int ans = bad; for ( int i = 0 , j = count; j < n; ++i, ++j) {// Decrement count of previous window if (arr[i] > k) --bad; // Increment count of current window if (arr[j] > k) ++bad; // Update ans if count of 'bad' // is less in current window ans = Math.min(ans, bad); } return ans; }// Driver code public static void main(String[] args) { int arr[] = { 2 , 1 , 5 , 6 , 3 }; int n = arr.length; int k = 3 ; System.out.print(minSwap(arr, n, k) + "\n" ); int arr1[] = { 2 , 7 , 9 , 5 , 8 , 7 , 4 }; n = arr1.length; k = 5 ; System.out.print(minSwap(arr1, n, k)); } }// This code is contributed by Anant Agarwal.

Python3
# Python3 program to find # minimum swaps required # to club all elements less # than or equals to k together# Utility function to find # minimum swaps required to # club all elements less than # or equals to k together def minSwap(arr, n, k) :# Find count of elements # which are less than # equals to k count = 0 for i in range ( 0 , n) : if (arr[i] < = k) : count = count + 1# Find unwanted elements # in current window of # size 'count' bad = 0 for i in range ( 0 , count) : if (arr[i] > k) : bad = bad + 1# Initialize answer with # 'bad' value of current # window ans = bad j = count for i in range ( 0 , n) :if (j = = n) : break# Decrement count of # previous window if (arr[i] > k) : bad = bad - 1# Increment count of # current window if (arr[j] > k) : bad = bad + 1# Update ans if count # of 'bad' is less in # current window ans = min (ans, bad)j = j + 1return ans# Driver code arr = [ 2 , 1 , 5 , 6 , 3 ] n = len (arr) k = 3 print (minSwap(arr, n, k))arr1 = [ 2 , 7 , 9 , 5 , 8 , 7 , 4 ] n = len (arr1) k = 5 print (minSwap(arr1, n, k))# This code is contributed by # Manish Shaw(manishshaw1)

C#
// C# program to find minimum // swaps required to club all // elements less than or equals // to k together using System; class GFG {// Utility function to find minimum swaps // required to club all elements less than // or equals to k together static int minSwap( int []arr, int n, int k) {// Find count of elements which are // less than equals to k int count = 0; for ( int i = 0; i < n; ++i) if (arr[i] < = k) ++count; // Find unwanted elements in current // window of size 'count' int bad = 0; for ( int i = 0; i < count; ++i) if (arr[i] > k) ++bad; // Initialize answer with 'bad' value of // current window int ans = bad; for ( int i = 0, j = count; j < n; ++i, ++j) {// Decrement count of previous window if (arr[i] > k) --bad; // Increment count of current window if (arr[j] > k) ++bad; // Update ans if count of 'bad' // is less in current window ans = Math.Min(ans, bad); } return ans; }// Driver code public static void Main() { int []arr = {2, 1, 5, 6, 3}; int n = arr.Length; int k = 3; Console.WriteLine(minSwap(arr, n, k)); int []arr1 = {2, 7, 9, 5, 8, 7, 4}; n = arr1.Length; k = 5; Console.WriteLine(minSwap(arr1, n, k)); } }// This code is contributed by vt_m.

的PHP
< ?php // PHP program to find // minimum swaps required // to club all elements // less than or equals // to k together// Utility function to // find minimum swaps // required to club all // elements less than // or equals to k together function minSwap( $arr , $n , $k ) {// Find count of elements // which are less than // equals to k $count = 0; for ( $i = 0; $i < $n ; ++ $i ) if ( $arr [ $i ] < = $k ) ++ $count ; // Find unwanted elements in current // window of size 'count' $bad = 0; for ( $i = 0; $i < $count ; ++ $i ) if ( $arr [ $i ] > $k ) ++ $bad ; // Initialize answer // with 'bad' value of // current window $ans = $bad ; for ( $i = 0, $j = $count ; $j < $n ; ++ $i , ++ $j ) {// Decrement count of // previous window if ( $arr [ $i ] > $k ) -- $bad ; // Increment count of // current window if ( $arr [ $j ] > $k ) ++ $bad ; // Update ans if count of 'bad' // is less in current window $ans = min( $ans , $bad ); } return $ans ; }// Driver code $arr = array (2, 1, 5, 6, 3); $n = sizeof( $arr ); $k = 3; echo (minSwap( $arr , $n , $k ) . "\n" ); $arr1 = array (2, 7, 9, 5, 8, 7, 4); $n = sizeof( $arr1 ); $k = 5; echo (minSwap( $arr1 , $n , $k )); // This code is contributed by Ajit. ?>

输出:
1 2

时间复杂度:O(n)
辅助空间:O(1)

    推荐阅读