Given an array of 0 and 1, find minimum no. of swaps to bring all 1s together (only adjacent swaps allowed)

前端 未结 4 598
生来不讨喜
生来不讨喜 2020-12-19 16:52

If given an array of 1\'s and 0\'s, what\'s good algorithm to show the minimum number of adjacent swaps needed to group all of the 1\'s together. The 1\'s don\'t need to be

4条回答
  •  有刺的猬
    2020-12-19 17:39

    Hi, firstly I would like to suggest that the minimum number of adjacent swaps would be 2 for your given example instead of 3. As just swap index 0 with index 2. So 1 swap from left and 1 swap from right.

    Here is my way to find minimum of swaps to bring the array in consecutive 1's form -

    Step 1 : First find the centre index for maximum number of consecutive 1's Step 2 : Parse the left side of array to swap it and count the number of swap in a efficient manner(Do not swap unnecessarily) Step 3 : Do the same for the right side array Step 4 : Plus the counts of both side.

    Please have a look at my java program based on same strategy :

    `public class MinimumSwap 
    {
    //function to find consecutive number index
    public static int[] getMaxConsecutiveIndex(List array)
    {
        int desiredIndex = -1;
        int count = 0;
        int dupDesiredIndex = -1;
        int dupCount = 0;
    
        int i = 0;
        while(i < array.size())
        {
            if(array.get(i) == 0)
            {
                //pass duplcateIndex value to desiredIndex if count is more
                if(dupCount > count)
                {
                    desiredIndex = dupDesiredIndex;
                    count = dupCount;
                }
                dupDesiredIndex = -1;
                dupCount = 0;
            }
            else 
            {
                if(dupDesiredIndex == -1) 
                {
                    dupDesiredIndex = i;
                    dupCount = 1;
                }
                else
                {
                    dupCount++;
                }
            }
            i++;
        }
        return new int[]{desiredIndex,count};
    }
    
    public static int swapCount(List array,int startIndex, int      endIndex, boolean side)
    {
        // side == false means 0 at the left
        // side == true means 1 at the left
        System.out.println("startIndex  "+startIndex+"  endIndex  "+endIndex+" side "+side);
        int swapCount = 0; 
        if(side == false)
        {
            while(startIndex <= endIndex)
            {
                if(array.get(endIndex) == 0) // swap from the end only if it is 0
                {
                    //check for first 1 from left to swap
                    while(array.get(startIndex) == 0 && (startIndex != endIndex))
                        startIndex++;
    
                    if(array.get(startIndex) == 1)  
                    {
                        // now swap
                        int temp = array.get(startIndex);
                        array.set(startIndex, array.get(endIndex));
                        array.set(endIndex,temp);
                        swapCount++;
                        endIndex--;
                    }
                }
                endIndex--;
            }
        }
        else
        {
            while(startIndex <= endIndex)
            {
                if(array.get(startIndex) == 0) // swap from the starting only if it is 0
                {
                    //check for first 1 from right to swap
                    while(array.get(endIndex) == 0 && (startIndex != endIndex))
                        endIndex--;
                    if(array.get(endIndex) == 1)    
                    {
                        // now swap
                        int temp = array.get(startIndex);
                        array.set(startIndex, array.get(endIndex));
                        array.set(endIndex,temp);
                        swapCount++;
                        startIndex++;
                    }
                }
                startIndex++;
            }
        }
        return swapCount;
    }
    
    public static void main(String...strings)
    {
        List arr = new ArrayList();
        int temp[] = {0,1,1,0,0,0,1,1,1,0,1,1,1,0,1,1,1,1,0,1};
        //int temp[] = {1,0,0,1,1,0,1};
        for(int i=0; i

    } `

    I am not very sure about performance. But as per my knowledge it should not be inefficient. If anyone finds any performance issue please do let me know :)

提交回复
热议问题