美文网首页
魔改的二分法

魔改的二分法

作者: 禅之风 | 来源:发表于2019-08-06 21:57 被阅读0次

魔改二分法,多个重复值下标二分法查找

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BinarySearch{
    /**
     *
     * @param array  参数数组
     * @param target 查找的目标值
     * @return  目标值所在的下标的集合
     */
    public static List<Object> binarySearch(Object array[], Object target){
        //最左下标
        int left = 0;
        //最右下标
        int right = array.length -1;
        //用于存储重复元素的下标集合
        List result = new ArrayList();
        while (left <= right){
            //二分查找中间值
            int mid = (left + right) / 2;
            //如果中间值等于目标值
            if(array[mid].equals(target)){
                if(mid > 0){
                    //看前一个元素是否也等于目标值
                    if(array[mid -1].equals(target)){
                        for(int i = mid - 1; i>=0; i--){
                            if(array[i] == target){
                                //添加排在所查到的值的前边的相同的下标
                                result.add(i);
                            }else break;
                        }
                    }
                }
                //添加第一次查到的目标值的下标
                result.add(mid);
                if(mid < right){
                    //看后一个元素是否也等于目标值
                    if(array[mid + 1].equals(target)){
                        for (int i = mid + 1; i<=right; i++){
                            if(array[i].equals(target)){
                                //目标值相等则将下标添加到集合中
                                //添加所查到的目标值后边的相同的下标
                                result.add(i);
                            }else break;
                        }
                    }
                }
                return result;
                //为了避免不同数据类型比较大小的差异,都将数据转换为String类型进行比较
            }else if((target.toString().compareTo(array[mid].toString())) < 0){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        if(result.size() == 0){
            //如果没有找到目标值,则返回-1
            result.add(-1);
        }
        return result;
    }

    public static void main(String[] args) {
        Double array[] = {55.2,65.5,47.5,47.5,82.6};
//        String array[] = {"123","123","121","121","456"};
        //将数组排序
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
        System.out.println(binarySearch(array, 47.5));
    }
}

这就是在经典的二分法基础上,通过向左向右循环查找相同目标值下边,返回所有重复下标的解法。
平时提起二分法都有印象,但是突然让你改一下,一时半会还不知道动哪里合适。
ps:记住了,面试贼容易问,跟语言无关,记住思路最重要。

相关文章

  • 魔改的二分法

    魔改二分法,多个重复值下标二分法查找 这就是在经典的二分法基础上,通过向左向右循环查找相同目标值下边,返回所有重复...

  • 算法:二分法查找(折半查找法)

    算法:二分法查找(折半查找法) 这是最经典的折半查找,而在面试的时候往往会对某些经典的数据结构和算法进行魔改,这道...

  • 2022-09-13 yolo的神奇和魔改

    可以魔改这个1470

  • BBR魔改

    安装 支持系统:Centos 6+/Debian 8+/Ubuntu 14+,BBR魔改版不支持Debian 8。...

  • 魔改皮肤

    靠最近想改人设。顺便把剑侠奇传的皮肤挂上去… 七日的皮肤会在之后我的生存实况中出现,是拿MCskin Editor...

  • 魔改:死话

    魔都第三综合精神病院 …… “不好!又让他跑了!” “警报!拉响警报!” …… “哇——呜——” “哇——呜——“...

  • 超级暴力版魔改BBR一键脚本forDebian

    阐明:超等暴力版魔改BBR装置方式刚说过了,参考:Debian/Ubuntu开启超等暴力版魔改BBR教程,不外是手...

  • 被魔改的佳作

    最近有个小热搜,《司藤》的作者尾鱼发了一条微博,大致意思是除了《司藤》以外,其他作品的改编都让她很无语,她最近试图...

  • 7登陆界面

    25分钟魔改welcome 28分钟

  • 聊天机器人调研

    想做一些自动化工具,调研一下聊天机器人 step 1. 魔改 IM, 以便能通过 API 调 IM 收发消息 魔改...

网友评论

      本文标题:魔改的二分法

      本文链接:https://www.haomeiwen.com/subject/qtcbdctx.html