算法:请找出数组中的某个数,它的左侧数字相加之和等于右边。
来源:互联网 发布:cpu百分率 linux命令 编辑:程序博客网 时间:2024/05/29 13:46
算法:请找出数组中的某个数,它的左侧数字相加之和等于右边。原 算法:请找出数组中的某个数,它的左侧数字相加之和等于右边。摘要: 二分查找的思想在算法面试题目中的使用,阿里算法面试题目:请找出数组中的某个数,它的左侧数字相加之和等于右边。看到这题,我的第一个想法就是从头到尾遍历数组,然后计算左边之和,右边之和,比较它们。实现看起来是这样的:/**傻逼遍历法 * @param array * @return */public static int stuFind(int[] array){ for(int i=1;i<array.length;i++){ int totalLeft=0; for(int le=0;le<i;le++){ totalLeft+=array[le]; } int totalRight=0; for(int ri=i+1;ri<array.length;ri++){ totalRight+=array[ri]; } if(totalLeft==totalRight){ return i; } } return -1;}既然是阿里的算法面试,当然不会这么轻易的放过你,楼上的遍历时间复杂度应该是n^2.其实还可以优化一下,反正是顺序后移,计算可以偷懒一下,当你第一次计算左边的值和右边的值以后,第二次移动,左边的值等于原先左边的值+当前位置前一个位置的值,右边的值等于原先右边的值减去当前的位置的数字的值。代码看起来是这样的:/**傻逼遍历法二 * @param array * @return */public static int stuFind(int[] array){ int totalLeft=0; int totalRight=0; for(int i=1;i<array.length;i++){ if(i==1){ for(int le=0;le<i;le++){ totalLeft+=array[le]; } for(int ri=i+1;ri<array.length;ri++){ totalRight+=array[ri]; } }else{ totalLeft+=array[i-1]; totalRight-=array[i]; } if(totalLeft==totalRight){ return i; } } return -1;}从头到尾的遍历,暂时想不出来更好的办法了,换个思路:既然某个数字的左边的值等于右边,那么可以算出数组的全部数值,然后加入一个二分查找的办法,定位到中间,如果左边的值*2=数组的和-当前位置的值,那么就可以说找到了,如果大于,那就向前移动,小于就向后移动。(为什么要左边的值*2,而不是(数组的和-当前位置的值)/2,欢迎你评论 :),算法的实现看起来是这样的:/** * 二分查找法 * @param array * @return */public static int splitFind(int[] array) { if (null == array || array.length == 0) { return -1; } int length = array.length; int head, tall, index; head = 0; tall = length - 1; index = length / 2; int total = 0; for (int i : array) { total += i; } do { int totalLeft = 0; for (int le = 0; le < index; le++) { totalLeft += array[le]; } int doubleValue=(total - array[index]); if (totalLeft*2 < doubleValue) { head=index; index = index + (length - index) / 2; } else if (totalLeft*2 > doubleValue) { tall=index; index = head + (index - head) / 2; } else { return index; } } while (index > head && index < tall); return -1;}
https://my.oschina.net/fengcunhan/blog/214508
0 0
- 算法:请找出数组中的某个数,它的左侧数字相加之和等于右边。
- 从一个数组中找出几个数,使其相加等于某个值的算法(数组元素可以重复)
- 找出数组中相加之和等于特定值的四个数
- [算法]给定一个整型数组,找出能相加起来等于一个特定目标数字的两个数。
- 快速找出一个数组中的两个数字,使两个数之和 等于一个已给定的值
- 找出数组中满足其左边的数都小于等于它,右边的数都大于等于它的数
- 在一个数组中,找出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 数组中两个数之和等于某个数字,返回这两个数的下标
- 整数算法训练05—一个数如果恰好等于它的因子之和,这个数被成为”完数” 例如:6=1+2+3.请编程找出1000以内的完数
- 找出数组里大于等于左侧、小于等于右侧的所有数
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 算法题27 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 93 求数组,左边的数都小于等于它,右边的数都大于等于它
- 面试--求数组,左边的数都小于等于它,右边的数都大于等于它
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数[#63]。
- 数据结构_线性表总结_思维导图
- 下一个世界级的科技企业将在中国诞生
- POJ 1118 Lining Up
- 数据库里表的取值问题
- ubuntu 访问另一个ubuntu服务器samba
- 算法:请找出数组中的某个数,它的左侧数字相加之和等于右边。
- 布隆过滤器(Bloom Filter)的原理和实现
- 六.javaweb之Servlet详细原理介绍
- jQuery控制页面样式的变化
- 49. Group Anagrams
- 模型定位
- seajs的使用
- kaggle入门篇一【手写数字识别】
- python之FTP程序(支持多用户在线)