Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Inaccuracy in code which returns the next permutation of an array

I was solving a question on leetcode with the description:

The next permutation of an array of integers is the next lexicographically greater permutation of its integer. More formally, if all the permutations of the array are sorted in one container according to their lexicographical order, then the next permutation of that array is the permutation that follows it in the sorted container. If such arrangement is not possible, the array must be rearranged as the lowest possible order (i.e., sorted in ascending order).

This is what I came up with in C++:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

    void nextPermutation(vector<int>& nums) {
        
            int index = -1, j = nums.size() - 1;

            for (int i = nums.size() - 1; i > 0; i--)
            {
                if(nums[i - 1] < nums[i])
                {
                    index = i - 1;
                    break;
                }
            }

            if(index == -1)
            {
                reverse(nums.begin(), nums.end());
                return;
            }

            for (int i = nums.size() - 1; i >= index + 1; i--)
            {
                if(nums[i] > nums[index])
                {
                    j = i;
                }
                break;
            }

            swap(nums[index], nums[j]);
            reverse(nums.begin() + index + 1, nums.end());

        }

Here I traversed the array from left to right and look for an element which is smaller than the element on its right(named it index), and then traversed it again looking for a number just bigger than the number before and swapped them and then reversed the array after index

This code works for the example cases but fails in a case where:

Input: [2,3,1]

MyOutput: [1,2,3]

Expected Output: [3,1,2]

I do not understand what I did wrong and everything should be working but its not.

>Solution :

Your issue is that the break statement in second loop is outside the if block.

if (nums[i] > nums[index])
{
    j = i;
}
break;    // <--------- this should be inside if

Putting it inside, gives the correct result.

if (nums[i] > nums[index])
{
    j = i;
    break;
}

Demo: https://godbolt.org/z/147We9c4q

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading