(Java)荷兰旗问题

(Java)荷兰旗问题

输入一个数组和一个数num,将数组中的数放到num的左边,相等的放在中间,比num大的放在右边。

import java.util.*;
public class HeLanQi {
    public static void main (String [] args)
    {
        Scanner cin = new Scanner(System.in);
        int num = cin.nextInt();
        int arr[] = new int[5];
        for (int i=0; i<arr.length; i++)
        {
            arr[i] = cin.nextInt();
        }
        heLanQi(arr, 0, arr.length-1, 5);
        for (int i=0; i<arr.length; i++)
        {
            System.out.print(arr[i]+" ");
        }
    }
    public static void  heLanQi(int arr[], int l, int r, int num)
    {
        int less = l - 1;
        int more = r + 1;
        int cur = l;
        while (cur < more)
        {
            if (arr[cur] < num)
                swap(arr, ++less, cur++);
            else if (arr[cur] > num)
                swap(arr, --more, cur);
            else
                cur++;
        }
        //return new int[] {less+1, more-1};
    }
    public static void swap(int arr[], int a, int b)
    {
        int temp = arr[b];
        arr[b]= arr[a];
        arr[a] = temp;
    }

}

荷兰问题是一个经典的动态规划问题,它源于一种常见的字符串排序需求:给定一个由红、白、蓝三种颜色组成的数组,其中红色在左,蓝色在右,中间可能夹杂着白色部分,目标是将数组分割成红、白、蓝三部分,使得每部分的颜色相同。这个问题可以通过动态规划来解决,主要利用一个状态数组记录当前序列中前缀的最大红色长度和最小蓝色长度。 Java动态规划实现的大致步骤如下: 1. 初始化:创建一个长度为n+1的状态数组,其中dp = 0, dp[i]代表前i个元素的最优解,初始状态就是序列为空。 2. 状态转移:对于每个位置i,有三种情况: a. 如果第i个元素是红色,那么红色部分不改变,dp[i] = dp[i-1] + 1(如果红色边界能扩展)。 b. 如果第i个元素是白色,那么红色和蓝色边界都不变,因为白色不影响,dp[i] = dp[i-1]。 c. 如果第i个元素是蓝色,那么蓝色部分不改变,dp[i] = dp[i-1],但红色边界缩小到0,因为蓝色结束了。 3. 最终结果:dp[n]就是整个序列的最优解,即最终的红色、白色和蓝色部分的长度。 动态规划代码示例: ```java public int hIndex(int[] nums) { int n = nums.length; int[] dp = new int[n + 1]; for (int i = 1; i <= n; i++) { if (nums[i - 1] == 0) { dp[i] = Math.min(dp[i - 1], i); } else { dp[i] = dp[i - 1]; } if (nums[i - 1] > 0) { dp[i] = Math.max(dp[i], dp[i - nums[i - 1]] + 1); } } return dp[n]; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值