您当前的位置: 首页 >  算法

庄小焱

暂无认证

  • 2浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法问题——(二分法问题)

庄小焱 发布时间:2020-07-08 15:38:04 ,浏览量:2

牛牛最近搬到了一座新的城镇,这个城镇可以看成是一个一维的坐标系。城镇上有n个居民,第i个居民的位置为aia_iai​。现在牛牛有m个搬家方案,在第i个方案中他会搬到位置xix_ixi​。

/**
 * Copyright (C), 2018-2020
 * FileName: solve001
 * Author:   xjl
 * Date:     2020/7/8 9:13
 * Description: 题目描述 牛牛最近搬到了一座新的城镇,这个城镇可以看成是一个一维的坐标系。城镇上有n个居民,第i个居民的位置为aia_iai​。现在牛牛有m个搬家方案,在第i个方案中他会搬到位置xix_ixi​。  俗话说的好,远亲不如近邻。现在牛牛想知道,对于每个搬家方案,搬家后与最近的居民的距离为多少。
 */
package second_category;

import org.junit.Test;

public class solve001 {
    //通过率只有80%
    /**
     * 远亲不如近邻
     *
     * @param n int整型 居民个数
     * @param m int整型 方案个数
     * @param a int整型一维数组 居民的位置
     * @param x int整型一维数组 方案对应的位置
     * @return int整型一维数组
     */
    public int[] solve(int n, int m, int[] a, int[] x) {
        //返回的结果
        int[] result = new int[m];
        //遍历两次的x的数据 每一个在数组中最小的元素
        for (int i = 0; i < m; i++) {
            int min=Math.abs(x[i]-a[0]);
            for (int j = 0; j < n; j++) {
                int res=Math.abs(x[i]-a[j]);
                min=min nums2.length) {
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }

        int m = nums1.length;//短的数组
        int n = nums2.length;//长的数组

        //分割线左右两边的所需要的满足的个数
        int totalleft = (m + n + 1) / 2;
        //在numns中的找到恰当的分割线[o,m]
        //使得nums1[i-1]  nums1[i]) {
//                //搜索下一轮的区间是 [i+1 right]
//                left = i + 1;
//            } else {
//                //下一轮的搜索区间是 [left,i]
//                right = i;
//            }
//        }
        //防止下标的越界的情况
        int i = left;
        int j = totalleft - i;
        int nums1leftmax = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
        int nums1Rightmin = i == m ? Integer.MAX_VALUE : nums1[i];
        int nums2leftmax = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
        int nums2Rightmin = j == n ? Integer.MAX_VALUE : nums2[j];

        if ((m + n) % 2 == 1) {
            return Math.max(nums1leftmax, nums2leftmax);
        } else {
            return (double) (Math.max(nums1leftmax, nums2leftmax) + Math.min(nums1Rightmin, nums2Rightmin)) / 2;
        }
    }
}

 

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0750s