2023年8月24日 星期四

[Java] Partition equal subset sum

 class Solution {

    public boolean canPartition(int[] nums)
    {
        int n = nums.length;
        int sum = 0;
        for(int i=0; i<n; i++)
        {
            sum+=nums[i];
        }
       
        if(sum%2 !=0 ) return false;

        sum = sum/2;
        boolean[][] possible = new boolean[n+1][sum+1];
        for(int i=0; i<=n; i++) possible[i][0] = true;

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=sum; j++)
            {
                if(nums[i-1] > j)
                {
                    possible[i][j] = possible[i-1][j];
                }
                else
                {
                    possible[i][j] = possible[i-1][j-nums[i-1]] || possible[i-1][j];
                }
            }
        }
        return possible[n][sum];
    }
};


[Java] Next Permutation

 class Solution {


    public boolean nextPermutation(int[] nums) {

        int ind1=-1;

        int ind2=-1;

        // step 1 find breaking point 

        for(int i=nums.length-2;i>=0;i--){

            if(nums[i]<nums[i+1]){

                ind1=i;

                break;

            }

        }

        // if there is no breaking  point 

        if(ind1==-1){

            reverse(nums,0);

return false;

        }

        

        

// step 2 find next greater element and swap with ind2

for(int i=nums.length-1;i>=0;i--){

if(nums[i]>nums[ind1]){

ind2=i;

break;

}

}


swap(nums,ind1,ind2);

// step 3 reverse the rest right half

reverse(nums,ind1+1);

        return true;

    }

    void swap(int[] nums,int i,int j){

        int temp=nums[i];

        nums[i]=nums[j];

        nums[j]=temp;

    }

    void reverse(int[] nums,int start){

        int i=start;

        int j=nums.length-1;

        while(i<j){

            swap(nums,i,j);

            i++;

            j--;

        }

    }

}