当前位置: 首页 > 知识库问答 >
问题:

城市间最大不重叠桥梁的算法

毛正浩
2023-03-14

河的两边有相等数量的城市。从一侧的城市到另一侧的城市的桥由1#Y3表示,其中城市1在下侧,桥到城市3在上侧。我们必须找到最大数量的非重叠桥。因此对于输入的1#Y2、2#Y4、3#Y1、4#Y5、5#Y3、6#Y6输出将是4,因为1#Y2、2#Y4、4#Y5、6#Y6是不重叠的。

这是我的密码-

public static int maxNonOverlappingBridges(String input1[]) {
    int result = 0;
    for (int i = 0; i < input1.length; i++) {
        int total = 1;
        int notCrossing = Integer.parseInt(input1[i].substring(input1[i].length() - 1));
        for (int j = 0; j < input1.length; j++) {
            if (j < i) {
                if (Integer.parseInt(input1[j].substring(input1[j].length() - 1)) < notCrossing) {
                    total += 1;
                    notCrossing = Integer.parseInt(input1[j].substring(input1[j].length() - 1));
                }
            } else if (j > i) {
                if (Integer.parseInt(input1[j].substring(input1[j].length() - 1)) > notCrossing) {
                    total += 1;
                    notCrossing = Integer.parseInt(input1[j].substring(input1[j].length() - 1));
                }
            } else {
                notCrossing = Integer.parseInt(input1[j].substring(input1[j].length() - 1));
            }

        }
        if (total > result) result = total;
    }
    return result;
}

对此有没有更优化的算法?

共有1个答案

澹台俊材
2023-03-14

这在O(nLog(n))中运行。

public static int maxNonOverlappingBridges(String[] bridges) {
    int overlappings1 = 0;
    int overlappings2 = 0;
    int maxIndexOfCityOnOtherSide = 0;

    /*
     * Sorting bridge connections with respect to the left index. (i.e : 2 in 2#y4)
     * O(n*log(n)) time
     */      
    Arrays.sort(bridges);

    List<Integer[]> brigesAsArray = new ArrayList<>();

    Integer[] previousBridge = null; 

    for(String b: bridges){

        if(previousBridge == null){
            String[] bridgeIndexes = b.split("#y");
            previousBridge = new Integer[]{Integer.parseInt(bridgeIndexes[0]),Integer.parseInt(bridgeIndexes[1])};
            maxIndexOfCityOnOtherSide = previousBridge[1];              
            brigesAsArray.add(previousBridge);
            continue;
        }

        String[] bridgeIndexes = b.split("#y");
        Integer[] currentBridge = new Integer[]{Integer.parseInt(bridgeIndexes[0]),Integer.parseInt(bridgeIndexes[1])};

        if(currentBridge[1] < maxIndexOfCityOnOtherSide){
            //overlapping found;
            overlappings1++;
        }else{
            maxIndexOfCityOnOtherSide = currentBridge[1];
        }

        previousBridge = currentBridge;
        brigesAsArray.add(previousBridge);
    }       

    Integer[][] bridgeIndexes = brigesAsArray.toArray(new Integer[0][0]);
    brigesAsArray.toArray(bridgeIndexes);       

    /*
     * Sorting bridge connections with respect to the right index. (i.e : 4 in 2#y4)
     * O(n*log(n)) time
     */ 

    Arrays.sort(bridgeIndexes, new Comparator<Integer[]>() {
        @Override
        public int compare(Integer[] o1, Integer[] o2) {
            return Integer.compare(o1[1], o2[1]);
        }           
    });

    previousBridge = null;

    for(Integer[] b: bridgeIndexes){

        if(previousBridge == null){
            maxIndexOfCityOnOtherSide = b[0];   
            previousBridge = b;
            continue;
        }

        if(b[0] < maxIndexOfCityOnOtherSide){
            //overlapping found;
            overlappings2++;
        }else{
            maxIndexOfCityOnOtherSide = b[0];
        }

        previousBridge = b;
        brigesAsArray.add(previousBridge);
    }   
    return (bridges.length - Math.min(overlappings1, overlappings2));
}

希望这有帮助。

 类似资料:
  • l和r分别是区间的起点和终点。

  • 我正在寻找一个有效的解决方案,从矩阵中选择不重叠的值,而不考虑成本的最小化。匈牙利算法通过选择一个代价最小的组合来解决指派问题。然而,我想要一个最大值的最小化。 匈牙利人会选择 总成本=1+2+5=8 但是,最大值为5。 我希望将组合选择为 所以我想要的输出是:4,3,2 而不是成本最小化。我想选择一个最小最大数量的组合。

  • 问题详情: 拉绍夫是埃姆兰市市长。埃姆兰由十字路口和街道组成。从每个交叉口到任何其他交叉口都只有一条路径。交点用正整数1...n表示。一家建筑公司向Rashof提出要重建埃姆兰的所有街道,但Rashof最多可以选择建筑公司为每条街道提供了一个新的长度,这意味着在街道重建后,街道的长度会发生变化。现在,作为城市的市长,拉绍夫必须明智地做出选择,使所有对交叉口之间的路径长度之和最小化。救救Rashof

  • 当我们需要将抽象与其实现分离时,使用Bridge,以便两者可以独立变化。 这种类型的设计模式属于结构模式,因为这种模式通过在它们之间提供桥接结构来分离实现类和抽象类。 这种模式涉及一个接口,它充当一个桥梁,使具体类的功能独立于接口实现者类。 两种类型的类都可以在结构上进行更改而不会相互影响。 我们通过以下示例演示Bridge模式的使用,其中可以使用相同的抽象类方法但不同的桥实现者类以不同的颜色绘制

  • 我的城市是一款增量点击游戏。你需要点击收获原始资源,然后注意: 要用现金购买东西 研究需要脑力 运行事物需要能量 矿石可提供基础材料 水可作为消耗品 犯罪会让你付出代价...(尚未实施) 污染会使你生病    

  • 定义 选择城市的组件。 图片展示 代码演示 import City from 'pile/dist/components/city' <City show={false} // cityArr={cityArr} // 城市数组 // position= {cityArr[0]} //定位城市 // 城市对象的默认属性为 // city_id、city_name、firs