将一个数组拆分成两个数组,两个数组的差的绝对值最小
2017-03-06 22:21
375 查看
要求如题,是qq群里一个大神让我敲的demo,花了2个小时,用c语言实现。但是数组的元素只能是正数!
思路是:
1).先求出数组的总和sum, sum/2=mid
2).然后将数组的元素跟mid比较,取出跟mid最接近的元素,放在第一个小数组里,然后在原来数组删除刚刚被取出的元素,更新原来数组
3).接着再取出离mid最近的元素,放在第二个小数组,在原数组中删除刚刚被取出的元素,更新原来数组
4).遍历原来数组,重复2和3,往后的元素放在第一个小数组或者第二个小数组,取决于两个小数组的所有元素的总和,哪个总和小就放在哪个小数组
测试:
思路是:
1).先求出数组的总和sum, sum/2=mid
2).然后将数组的元素跟mid比较,取出跟mid最接近的元素,放在第一个小数组里,然后在原来数组删除刚刚被取出的元素,更新原来数组
3).接着再取出离mid最近的元素,放在第二个小数组,在原数组中删除刚刚被取出的元素,更新原来数组
4).遍历原来数组,重复2和3,往后的元素放在第一个小数组或者第二个小数组,取决于两个小数组的所有元素的总和,哪个总和小就放在哪个小数组
#include<stdio.h> void binaryMiun(int s[], int n); int abs(int a); int main() { int n, i, t; int s ; printf("输入原始数组的个数: \n"); scanf("%d", &n); printf("请输入数组元素:\n"); for(i = 0; i < n; i++) { scanf("%d", &t); s[i] = t; } printf("您输入的数组是:"); for(i = 0; i < n; i++) { printf("%d ", s[i]); } printf("\n"); binaryMiun(s, n); return 0; } void binaryMiun(int s[], int n) { int i, h, mid, temp, k; int l ;//第一个小数组 int r ;//第二个小数组 int min; int lcount = 0; int rcount = 0; int sum = 0; int suml = 0;//第一个小数组元素总和 int sumr = 0;//第二个小数组元素的总和 int j = 0; //该for循环遍历数组求元素的总和sum for(int i = 0; i < n; i++) { sum += s[i]; } //mid 为元素总和的一半 mid = sum/2; for(h = 0; h < n;) { min = mid - s[0]; //找出离mid最近的元素 for(i = 0; i < n; i++) { temp = mid - s[i]; if(temp <= min) { min = temp; //距离mid最近的元素的下标 j = i; } } printf("出列的元素是------>%d\n", s[j]); //将取出的元素放在元素总和较小的数组 if(suml <= sumr) { l[lcount++] = s[j]; suml += s[j]; } else { r[rcount++] = s[j]; sumr += s[j]; } //将刚刚在原数组取出的元素删除,更新原数组 for(k = j; k < n; k++) { s[k] = s[k+1]; } n--; printf("原数组变为:"); for(k = 0; k < n; k++) { printf("%d ", s[k]); } printf("\n"); } printf("第一个数组:"); for(i = 0; i < lcount; i++) { printf("%d ", l[i]); } printf("\n第二个数组:"); for(i = 0; i < rcount; i++) { printf("%ld ", r[i]); } printf("\n拆分成两个数组的最小绝对值之差是:%d\n", abs(sumr-suml)); } int abs(int a) { if(a < 0) return -a; else return a; }
测试:
相关文章推荐
- 已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 有一个整数数组,请求出两两之差绝对值最小的值, 记住,只要得出最小值即可,不需要求出是哪两个数。
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 (微软面试题)
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 算法:讲一个list拆分为两个list,并使两个list和的差的绝对值最小
- 一道面试题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值
- 求一个数组差的绝对值的最小值
- 数组中的数分为两组,使得两个组的和的差的绝对值最小
- 1、有一个整数数组,求出两两只差绝对值最小
- 求最小绝对值子串、一个整数数组求两两之差绝对值最小值
- 有一个整数数组,请求出两两之差最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- 有一个整数数组,请求出两两之差绝对值最小的值