首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【算法面试题】两个长度相同,元素为随机整数的无序数组,交换位置,使得两个数组的和的差值最小。

最后是一道算法题:两个长度相同,元素为随机整数的无序数组,交换位置,使得两个数组的和的差值最小?没有手写算法的经验,所以直接给跪了。 回到家,打开笔记本记录一下。.../** * 有两个数组a,b,大小都为n,数组元素为任意整数,无序 * 要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间差的绝对值最小。...* 2、分别在两个数组中找出一个数据,使得这两个数据的差值最接近数组和的差值,然后记录坐标 * 3、交换两个坐标的数据,然后递归执行此过程。...* 4、当数组和相等时,又或者是两个数组中找不到元素差值小于数组和差值的数据时得出最终结果 */ public static void calculate(int[] array, int...} //找到一对小于等于差值的数据进行交换 // 记录需要更换的两个坐标,以及坐标的差值 int sub_one = 0, sub_two = 0, sub_diff

1.3K10

- 从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的

题目:从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的 Fisher-Yates洗牌算法是由 Ronald A.Fisher和Frank Yates于1938年发明的,后来被Knuth...等概率: 洗牌算法有些人也称等概率洗牌算法,其实发牌的过程和我们抽签一样的,大学概率论讲过抽签是等概率的,同样洗牌算法选中每个元素是等概率的。...用洗牌算法思路从1、2、3、4、5这5个数中,随机取一个数 4被抽中的概率是1/5 5被抽中的概率是1/4 * 4/5 = 1/5 2被抽中的概率是1/3 * 3/4 *...4/5 = 1/5 1被抽中的概率是1/2 * 1/3 * 3/4 * 4/5= 1/5 3被抽中的概率是1 * 1/2 * 1/3 * 3/4 * 4/5 = 1/5 时间复杂度为...该算法的基本思想和 Fisher 类似,每次从未处理的数据中随机取出一个数字,然后把该数字放在数组的尾部,即数组尾部存放的是已经处理过的数字。

1.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何从有序数组中找到和为指定值的两个元素下标

    如何从有序数组中找到和为指定值的两个元素下标?...例如:{2, 7, 17, 26, 27, 31, 41, 42, 55, 80} target=72.求得值为17和55,对应下标为:2,8 思考下,只要将元素自己与后面的所有元素相加计算一下,就能找到对应的两个值...,但这种算法时间复杂度为O(n^2),需要优化一下....换个思路,在这个有序数组中,可以使用2个指针分别代表数组两侧的两个目标元素.从目标数组的两侧,向中间移动;当两个指针指向的元素计算值,比预定值target小了,那左侧指针右移下,重新计算;当计算值大于target...时,右侧指针左移下,直到两个元素和与target相等.这种方法叫做搜索空间缩减,这也是这道题的关注点.这种方法的时间复杂度只有O(2*n)(非严谨说法),是非常高效的一种方法了.

    2.3K20

    面试算法:lg(k)时间查找两个排序数组合并后第k小的元素

    对于一个排好序的数组A,如果我们要查找第k小的元素,很简单,只需要访问A[k-1]即可,该操作的时间复杂度是O(1).假设给你两个已经排好序的数组A和B,他们的长度分别是m和n, 如果把A和B合并成一个排序数组...根据这两个性质,我们只要通过查找到 l-1, 那么我们就可以找到 u - 1, 进而就能找到第k小的元素。我们可以通过在数组A中,利用上面提到的两个性质,通过折半查找来找到 l - 1 的值。...A和B, 两数组中的元素值根据随机数生成,然后把两数组合并成数组C, 并且先输出第k小的元素。...combined array is:9 Index of A is 3 value of element is: 9 Index of B is 2 value of element is: 3 程序先创建了两个排序数组...A,B,并分别打印出他们元素的内容,同时将两数组合并成数组C, 并给出第7小的元素,它的值是9,接着输出数组A元素的对应下标是3, 也就是数组A的前4个元素组成了合并后数组C前7小元素的一部分,输出第二个下标

    1.4K20

    python面试题-找到两个数组元素和小于等于目标值target的最大值的所有组合

    题目: 给定2个数组(不是有序的),再给定一个目标值target,找到两个数组元素和小于等于目标值target的最大值的所有组合 示例一: 数组a 为[3, 8,5] 数组b 为[2, 1,4] 目标值...10 输出:(8,2)  因为 8+2<=10 示例二 数组a为 [5, 7, 2] 数组b为[4, 2, 1] 目标值10 输出为(5, 4), (7,2)因为5+4=7+2<=10 代码参考 """...else: if i+j == sum(target_map[-1]): # 如果新的元素相加跟收集结果里面值的相等...target_map.append((i, j)) if i + j > sum(target_map[-1]): # 如果新的元素相加大于收集结果里面值的相等...target_map.append((i, j)) if i + j < sum(target_map[-1]): # 如果新的元素相加小于收集结果里面值的相等

    1.4K10

    【算法题】输入一维数组array和n,找出和值为n的任意两个元素

    题目描述 输入一维数组array和n,找出和值为n的任意两个元素。例如: array = [2, 3, 1, 10, 4, 30] n = 31 则结果应该输出1, 30 顺序不重要。...package com.light.sword; /** * @author: Jack * 2021/4/21 下午7:51 * * 输入一维数组array和n,找出和值为n的任意两个元素...array[j + 1] = temp; } } } } } 冒泡排序说明: 依次比较相邻的两个数......... (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成 (4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的...(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。 (6)依次类推,每一趟比较次数减少依次

    1.3K20

    【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境

    输入描述: 键盘随机输入 6 个整数 输出描述: 输出数组中的所有元素,每个元素中间使用空格隔开 例如:10 20 30 40 50 60 示例1 输入: 10 20 30 40 50 60 输出:...描述 牛牛尝试把一个长度为 n 的数组转换成链表并把链表前两个节点交换位置和把链表最后两个节点交换位置。...描述 牛牛输入了一个长度为 n 的数组,他想把这个数组转换成链表,链表上每个节点的值对应数组中一个元素的值,然后遍历链表并求和各节点的值。...输入描述: 第一行输入两个正整数 n 和 x 表示数组的长度和要删除的链表节点值 x 。 第二行输入 n 个正整数表示数组中每个元素的值。...描述 牛牛输入了一个长度为 n 的数组,他把这个数组转换成链表并在第 i 个节点的后面添加一个值为 i 的新节点 输入描述: 第一行输入两个正整数分别是 n 和 i ,表示数组的长度、需要添加节点的位置和节点的值

    15810

    Python | numpy matplotlib scipy练习笔记

    reshape变换为任意行数,1列的列向量 # arange(6)为[0 1 2 3 4 5] #广播机制:行向量与列向量相加,各自相加,形成矩阵 # a = np.arange(0, 60, 10)...(索引) ### 返回数组a中所有在数组b中对应下标为True的元素 ### b与a不共享内存空间,不相互影响 a = np.random.rand(10) #生成10个满足[0, 1)中均匀分布的随机数...(利用广播机制) # z = np.mgrid[a:x:m, b:y:n] 两个参数,生成一个三维空间向量由两个数组z[0]和z[1]组成,步长分别为m和n, [a, x) [b, y) # 第二种:z...(1 2)共两列;默认步长为1,左闭右开;分成的元素由mn或cd决定 # 第一个数组z[0]的元素由第一个参数决定(2 3 4),共三种元素;第二个数组z[1]的元素由第二个参数决定(1 2),共两种元素...,利用到笛卡尔乘积;uv为一维数组 # 返回的两个矩阵xy,行数由u控制,列数由v控制 # x列元素相同,y行元素相同 u = np.linspace(-3, 2, 5) v = np.linspace

    66000

    单向循环链表-《数据结构》自学方法指导

    ='\n'){   s=( *)malloc(sizeof());   s->data=ch;   r->next=s;   r=s;   }   r->next=NULL;//终端结点的指针域置空,或空表的头结点指针域置空...当线性表为空时,我们同样也称其为空栈。   假设栈S=(a1,a2,…,an),则称ai为栈底元素,an为栈顶元素。栈中元素按a1,a2,…,an的 次序进栈,退栈的第一个元素应为栈顶元素。...假设用一维数组S[arrmax]表示栈,则对非空栈,S[0]为最早进入栈的元素,S[top]为最迟进入栈的元素,即栈顶元素。...所以为了克服这种现象的方法就是将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。...只不过当头尾指针指向向量上界(-1)时,其加1操作的结果是指向向量的下界0。

    33730

    小论线性变换

    % 1 0 % 0 2 X2 = A2*X; px(X,'ro','r-') hold on px(X2,'b*','b:') hold off; % 换坐标系,从单位坐标系换到以特征向量为基底的坐标系...0可能是因为和其他基耦合 % 对角化后D上存在着为0的元素,有几个0说明有几个维度丢失。...A2 = [1 0 0 0]; X2 = A2*X; px(X,'ro','r-') hold on px(X2,'b*','b:') hold off; % 换坐标系,从单位坐标系换到以特征向量为基底的坐标系...A2 = [1 2 0 1]; X2 = A2*X; px(X,'ro','r-') hold on px(X2,'b*','b:') hold off; % 换坐标系,从单位坐标系换到以特征向量为基底的坐标系...5) mean((D(2,2)*Xnew(2,:) - Xnew2(2,:) ) < 1e-5) %% 如何将不能对角化的矩阵对角化,不存在奇异值为0的情况,矩阵是方阵 % SVD,构建起两个不同的坐标基

    81170

    js递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值

    生成一个长度为5的空数组arr。  生成一个(2-32)之间的随机整数rand。...把随机数rand插入到数组arr内,如果数组arr内已存在与rand相同的数字,则重新生成随机数rand并插入到arr内[需要使用递归实现,不能使用for/while等循环] 最终输出一个长度为5,且内容不重复的数组...arr[index]=randomNumber(arr); return nArr(length,arr); } 错误学习 Math.floor(Math.random()*31+2); 这样的写法是不严谨的...俺学习到了 (●’◡’●) 取范围区间值应该这样写: Math.floor(Math.random() * (max - min + 1)) + min; 原因如下: // 在 2 - 5 区间内生成随机数...别人的实现方式 俺看了一个比较优雅的代码,代码实现如下: // 6 行写完 function buildArray(arr, length, min, max) { var num = Math.floor

    1.6K21

    数据结构基础(二).单链表(1)

    ,这里用C语言实现一个简单的单向链表 ---- 概要 ---- 链表结构 将线性表中各元素分布在存储器的不同存储块中,通过地址或指针建立它们之间的联系,所得到的的存储结构为链表结构 链表结构根据指向的特性...,分为 单向链表 和 双向链表 Tips: 单双循环链表是它们的变种 线性表的顺序存储结构有存储密度高和能随机存取的优点,但有以下不足: 插入删除操作比较耗时,因为相应的后续元素要在存储器中成片移动 要求系统提供较大的连续存储空间...++) r=r->next; //定位到插入点前一个元素的位置 p->next=r->next; //挂上新节点 r->next=p; //接入新节点,及插入新节点 head->score...if(pos > r->score) pos=r->score; //对删除位置进行校正,位置超出最后一个元素时,定位到最后一个元素的位置 for(i=0;ir->next...; //定位到删除点前一个元素的位置 p=r->next; r->next=p->next; free(p); //对指定位置节点进行删除 head->score--; //及时更新元素个数

    78830

    机器学习第3天:线性回归

    来预测y (2)公式向量化 y = a·x 这里的a和x都是一组包含多个值的向量,为什么要这样做呢?...因为在代码中,我们常常把数据组合成向量进行训练 模型评估 我们当然要判断模型的性能,这时我们需要一个指标,在回归任务中,最常见的指标是MSE(均方误差) 其中m是数据的个数,容易得到,MSE越小时模型性能更好...设置随机数种子,以便结果复现 x = np.random.rand(100, 1) # 产生100个0-1的数据x y = 2*x+np.random.rand(100, 1) # 与x有线性关系并加上误差的...1)创建了一个二维数组,里面有100个一维数据,数据类型大概为[[x1], [x2], [x3], [x4]......]...pre_y = model.predict(x) 这里先定义模型为线性回归模型 然后fit()函数就是用x,y数据训练模型 predict()函数就是用训练好的模型进行预测

    12610

    python 中numpy基本方法总结可以类推tensorflow

    () 创建数组:np.zeros((2,3)),或者np.ones((2,3)),参数是一个元组分别表示行数和列数 对应元素相乘,a * b,得到一个新的矩阵,形状要一致;但是允许a是向量而b是矩阵...,a的列数必须等于b的列数,a与每个行向量对应元素相乘得到行向量。...+ - / 与 * 的运算规则相同。 数学上定义的矩阵乘法 np.dot(a, b)。如果形状不匹配会报错;但是允许允许a和b都是向量,返回两个向量的内积。...(PS:总之就是,向量很特殊,在运算中可以自由转置而不会出错,运算的返回值如果维度为1,也一律用行向量[]表示) 读取数组元素:如a[0],a[0,0] 数组变形:如b=a.reshape(2,3,4...,np.minimum(…….)相反 将a中元素都置为b:a.fill(b) 每个数组元素的指数:np.exp(a) 生成等差行向量:如np.linspace(1,6,10)则得到1到6之间的均匀分布

    2.1K50

    ③matlab向量和矩阵

    x = [3 5] x = 3 5 任务 创建一个名为 x 的数组,其中包含两个元素:7 和 9 3.当您用空格(或逗号)分隔数值时(如前面的任务中所示),MATLAB 会将这些数值组合为一个行向量...x = [1;3] x = 1 3 任务 创建一个名为 x 的数组,其中包含两个元素 7 和 9,且两个元素位于同一列中。...x = [abs(-4) 4^2] x = 4 16 任务 创建一个名为 x 的行向量,其中第一个元素为 sqrt(10),第二个元素为 pi^2 (π2)。...4.任务 创建一个名为 x 的行向量,该向量以 3 开头,以 13 结尾,每个元素的间距为 2。...任务 创建一个名为 x 的变量,该变量是一个 5×5 的随机数矩阵。 2.许多矩阵创建函数允许您输入一个数值来创建方阵 (n×n),或者输入两个数值来创建非方阵。

    11010

    简单粗暴理解支持向量机(SVM)及其MATLAB实例

    网络上也有很多相关的博客,讲解得都非常详细。如果你要从零开始推导一个SVM,细致抠它全程的数学原理,我建议可以阅读此篇文章:Zhang Hao的《从零构建支持向量机》。...传统的SVM做的事情其实就是找到一个超平面,实现二分类,一类+1,一类-1。如上所示。它的目的就是使得两类的间隔最大。黑色的块表示距离分割面最近的样本向量,称为支持向量。...那么我们就要训练C{2,5}=10(组合数)个SVM分类器。每个SVM分类器都可以区分出两种类别。我们把数据分别输入到这10个SVM分类器中,根据结果进行投票,依据得票数最多来确定它的类别。...交互检验模式,n为fold的个数,必须大于等于2   其中-g选项中的k是指输入数据中的属性数。...以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

    3K11

    【组合数学】不定方程解个数问题 ( 多重集r组合数 | 不定方程非负整数解个数 | 生成函数展开式中 r 次幂系数 | 给定范围系数 情况下不定方程整数解个数 )

    文章目录 多重集 r 组合数 生成函数计算方法 多重集 r 组合数题目 不定方程解个数 x 取值范围为 ( 0 ~ n ) 不定方程解个数 x 取值范围为 自然数 ( 0 ~ ∞ ) 符合多重集组合公式计算情况...; 生成函数中 y 的幂从 0 到 n_i , 1 是 y^0 ; x_i 对应的是多重集中的 , 指定某元素 a_i 的个数 ; ---- 多重集 r 组合数题目...6 ; ---- 不定方程解个数 x 取值范围为 ( 0 ~ n ) 该情况下 值 与 多重集 的组 r- 组合数是等价的 ; 此时的多重集中每个元素的个数 是限定在 0 到 某个数 n..., 指定某元素 a_i 的个数 ; ---- 不定方程解个数 x 取值范围为 自然数 ( 0 ~ ∞ ) 符合多重集组合公式计算情况 该情况下 值 与 多重集 的组 r- 组合数是等价的...; 此时的多重集中每个元素的个数 是无限的 或者 大于 等于 r ; 该情况下的多重集组合问题 , 可以使用组合公式 , 多重集 的 r- 组合 , 其有 k 种元素 每种个数大于等于

    91110

    python 中numpy基本方法总结可以类推tensorflow

    a是向量而b是矩阵,a的列数必须等于b的列数,a与每个行向量对应元素相乘得到行向量。...+ - / 与 * 的运算规则相同。 数学上定义的矩阵乘法 np.dot(a, b)。如果形状不匹配会报错;但是允许允许a和b都是向量,返回两个向量的内积。...(PS:总之就是,向量很特殊,在运算中可以自由转置而不会出错,运算的返回值如果维度为1,也一律用行向量[]表示) 读取数组元素:如a[0],a[0,0] 数组变形:如b=a.reshape(2,3,4...,np.minimum(…….)相反 将a中元素都置为b:a.fill(b) 每个数组元素的指数:np.exp(a) 生成等差行向量:如np.linspace(1,6,10)则得到1到6之间的均匀分布...三、矩阵方法 创建矩阵:np.mat(‘…’)通过字符串格式创建,np.mat(a)通过array数组创建,也可用matrix或bmat函数创建 matrix不会自动转换行列向量。

    1.2K30

    【组合数学】排列组合 ( 排列组合内容概要 | 选取问题 | 集合排列 | 集合组合 )

    P(n,r) 多重集排列无序选取集合组合 C(n,r) 多重集组合 选取问题中 : 不可重复的元素 , 有序的选取 , 对应 集合的排列 不可重复的元素 , 无序的选取 , 对应 集合的组合 可重复的元素..., 有序的选取 , 对应 多重集的排列 可重复的元素 , 无序的选取 , 对应 多重集的组合 三、集合排列 ---- n 元集 S , 从 S 集合中 有序 , 不重复 选取 r 个元素..., 该操作称为 S 集合的一个 r- 排列 , S 集合的 r- 排列记作 P(n, r) P(n,r)=\begin{cases} \dfrac{n!}..., 不重复 选取 r 个元素 , 该操作称为 S 集合的一个 r- 组合 , S 集合的 r- 组合记作 C(n, r) C(n,r)=\begin{cases} \dfrac{P...& n \geq r \\\\ 0 & n < r \end{cases} r- 排列也可以这样理解 ( 先组合后排列 ) : 选出 r 个有序的排列 C(n,r) , 可以先将其 r 个无序的选择做出来

    1.9K00
    领券