2022-05-19:给定一个数组arr,给定一个正数M, 如果arri + arrj可以被M整除,并且i j,那么(i,j)叫做一个M整除对。 返回arr中M整除对的总数量。 来自微软。...代码如下: fn main() { let arr: Vec = vec![5, 5, 5]; let ans = num2(&arr, 5); println!...("ans = {}", ans); } fn num2(arr: &Vec, m: isize) -> isize { let n = arr.len() as isize;...[]; for _i in 0..m { cnts.push(0); } let mut ans: isize = 0; let mut i: isize...= n - 1; while i >= 0 { let cur = (arr[i as usize] % m + m) % m; ans += cnts[((m
2022-05-19:给定一个数组arr,给定一个正数M, 如果arr[i] + arr[j]可以被M整除,并且i j,那么(i,j)叫做一个M整除对。 返回arr中M整除对的总数量。...代码如下: fn main() { let arr: Vec = vec![5, 5, 5]; let ans = num2(&arr, 5); println!...("ans = {}", ans); } fn num2(arr: &Vec, m: isize) -> isize { let n = arr.len() as isize;...[]; for _i in 0..m { cnts.push(0); } let mut ans: isize = 0; let mut i: isize...= n - 1; while i >= 0 { let cur = (arr[i as usize] % m + m) % m; ans += cnts[((m
答案2023-12-09: 灵捷3.5 大体过程如下: 算法1(makeArrayIncreasing1): 1.对arr2进行排序并去除重复元素,生成新的数组help,并统计cnt为help的长度。...算法2(makeArrayIncreasing2): 1.对arr2进行排序并去除重复元素,生成新的数组help,并统计cnt为help的长度。 2.创建dp数组,初始值为-1。...4.在process2中,若dp[i+1]不等于-1,直接返回dp[i+1]。 5.剩下的过程与makeArrayIncreasing1基本相同,只是将递归调用替换为对dp数组的查询和更新。...算法3(makeArrayIncreasing3): 1.对arr2进行排序并去除重复元素,生成新的数组arr2,并统计m为arr2的长度。 2.创建dp数组,长度为n+2,并初始化为最大整数。...• 算法3的时间复杂度为O(n * m + m * log(m)),其中m为arr2的长度,因为要对arr2进行排序并进行二分查找。
这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。...具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0...]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列。...其算法的基本思想是:先将待排记录序列分割成为若干子序列分别进行插入排序,待整个序列中的记录”基本有序”时,再对全体记录进行一次直接插入排序。...(increasement > 1); } 5、快速排序 快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序
这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。...具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr0),则将最小值min1和arr0交换,...接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr1,则交换这两个数字,依次类推,直到数组arr有序排列。...快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。...其算法的基本思想是:先将待排记录序列分割成为若干子序列分别进行插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。该算法时间复杂度为O(n log n)。
int minindex=j; for (int i = j+1; i arr.length ; i++) { if(min>arr[i]){...=i;//重置最小值的下标 } } //所以交换两个数组中的元素 arr[minindex]=arr...-1; j++) { int min=arr[j]; int minindex=j; for ( i = j+1; i arr.length...; i++) { if(min>arr[i]){ //说明最小值不是假设的数 min=arr...尽管它在实际应用中不是很高效,但由于其简单易懂的特性,常用于教学和对小型数据集的排序。 限于小编能力有限,本篇难免有些瑕疵,欢迎各位uu给出宝贵意见。 要是觉得本篇对你有帮助,请给小编一个小小的赞吧。
prefix_xor_left[i] = prefix_xor_left[i - 1] ^ arr[i]; } // 计算从右往左的前缀异或和 prefix_xor_right...j = i + 1; j j) { if (gcd(arr[i], arr[j]) > 1) { if (i_min == -1 |...| i i_min || (i == i_min && j j_min)) { i_min = i; j_min...for (int i = 0; i i++) { numbers[i] = i + 1; } // 使用qsort进行排序,使用自定义的比较函数...[n]; for (int i = 0; i i++) { scanf("%d", &arr[i]); } // 对数组进行排序 qsort(
具体来说,假设长度为n的数组 arr,要按照从小到大排序,那么先从n个数字中找到最小值 min1,如果最小值 min1 的位置不在数组的最左端(也就是 min1 不等于 arr[0]),则将最小值 min1...和 arr[0] 交换,接着在剩下的n-1个数字中找到最小值 min2,如果最小值 min2 不等于 arr[1],则交换这两个数字,依次类推,直到数组 arr 有序排列。...void selection_sort(int arr[], int len) { int i, j; for (i = 0 ; i i++) {...int min_index = i; for (j = i + 1; j j++) { // 遍历未排序的元素 if (arr[j] arr...在选择排序的实际应用中,它通常被用于对小型数据集进行排序,或者作为更复杂排序算法的一个组成部分。例如,在数据库和搜索引擎中,选择排序可以用来对查询结果进行排序,尤其是在结果集较小的情况下。
最近有小伙伴后台留言表示要详细了解一下冒泡排序和选择排序的原理,so阿Q便在这里做一个简单的介绍,希望对小伙伴加深冒泡排序以及选择排序的理解有点小帮助吧。 冒泡排序算法的原理如下: 比较相邻的元素。...arr.length - 1; i++) {//只需要比较arr.length-1次,i控制第几个索引处的值 for (int j = i + 1; j arr.length; j+...arr[i] = arr[j]; arr[j] = temp; } } } } 二分法查找: 前提是数组必须是有序的。...判断数组y索引处的值是否与x相等,若相等则得到该索引值,若不相等则进行判断:如果中间值大于x,则去索引值为0—[y-1]区间查找;若中间值小于x,则去[y+1]—[length-1]区间查找, 去重新确定的区间内重复步骤...= value) { //当中间值不等于要找的值,就开始循环查找 if(arr[mid] < value) { //当中间值小于了要找的值 min
首先对集合进行升序排序 * 2....先遍历字符串取出其中的数字放进一个集合, 然后对集合进行正序排序 * 2....System.out.println("max num is: " + max + " ; min num is: " + min); } } } 5.一个整型数组中,找到一个所有成对的数字...+ arr[j]; if (tmpSum == sum) { //如果只获取其中一对元素和等于sum直接return...重复上述分组和排序操作, 直到取di = 1(i >= 1)位置, 即所有记录成为一个组, 最后对这个组进行插入排序.
[0]进行交换; 第二次从arr[1] 到 arr[n-1] 中选取一个最值与arr[1]进行交换; 以此类推,直到arr[n-2]到arr[n-1]中选出最值交换后即完成排序...minIndex不等于循环开始前的首元素的索引0,发生交换。 ? 第一趟排序状态5 第二趟排序 ? 第二趟排序状态1 此时 120 > min当前值100,循环变量直接向后移动; ?...minIndex不等于循环开始前的首元素的索引2,发生交换。 ? 第三趟排序状态3 因为前n-1个元素均排序完毕,所以原数组排序完毕。...= i; min = arr[i]; for (int j = i + 1; j arr.length; j++) {...if (min > arr[j]) { min = arr[j]; minIndex = j;
本文主要从时间复杂度和空间复杂度的定义说起,然后介绍常见的时间复杂度和空间复杂度,最后则是对常见排序算法进行了总结。...void selectionSort(int[] arr, int n){ for(int i = 0; i i++){ int min = i; for...(int j = i + 1; j j++){ if(arr[j] arr[min]){ int tmp = arr[i];...n,而且后续未分配新的空间,因此该算法空间复杂度为 ; int[] arr = new int[n]; 二维数组的情况; int[][] arr = new int[n][n]; 常见排序算法的时间复杂度和空间复杂度...如果觉得文章对你有所帮助,那就点个赞再走吧!
重复上述步骤:不断重复这一过程,直到所有元素都被排序,未排序部分为空。时间复杂度:选择排序的时间复杂度为 (O(n^2)),其中 (n) 是数组的元素数量。...过程分析假设我们有一个数组 arr,内容为 [64, 25, 12, 22, 11],我们使用选择排序对其进行升序排列。...通过这个过程,我们可以清楚地看到每一步如何找到未排序部分的最小值,并将其放到正确的位置上,直到整个数组排序完毕。...let minIndex = i; for (let j = i + 1; j j++) { if (arr[j] arr...== i) { [arri, arrminIndex] = [arrminIndex, arri]; }如果 minIndex 不等于 i,说明在剩余部分找到更小的元素,需要将其与当前元素 arri 进行交换
排序算法的种类很多,在没对排序有了解时,我曾的天真的以为,直接选出其中一个最快的不就完事了么?但是真实情况会复杂一些,因为一个排序能从很多方便来衡量,并不能简单的拿效率说事。 1....二、选择排序(selectSort) 实现的原理是在未排好序的范围内找到最小的值,然后与该范围头部元素进行交换,从而完成整个数组的排序。...for (let j = i + 1; j arr.length; j++) { if (arr[min] > arr[j]) { // 找到最小的 min = j...,选择排序是要优于冒泡排序的,因为冒泡排序比较之后就会进行交换操作,而选择排序则非如此,每次内循环只是找到最小值那项的下标,内循环结束后与数组头部交换,剩下的范围内依然如此进行,所以比较次数虽然不会少,...对已经划分的小数组,继续使用patition的操作,直到划分为单个元素,不能再进行patition操作,整个数组的排序任务完成。
同理,再按照此方法,对两部分的数据进行排序,整个排序过程以递归的方式进行。...Quicksort(arr, left, r-1);//对左边的子数列按照同样的方法进行排序 Quicksort(arr, r+1, right);//对右边的子数列按照同样的方法进行排序...} } 选择排序 方法介绍 首先在未排序的数组中找到最大或者最小的元素,然后将其放在起始位置,同理,在未排序的数组中继续寻找最大或最小的数,将其放在已排序(每次找到的元素构成的数列)的数列的末尾。..., j, min; for (i = 0; i i++) { min = i; for (j = i + 1; j j++) { if (arr[j] arr...(适用于少量元素的排序) 可以类比为打扑克牌时,对扑克牌进行的排序。
n-1; i++) { // 找到未排序部分的最小元素 int min_idx = i; for (int j = i+1; j j++) {...内层循环用于找到未排序部分的最小元素索引min_idx。 打印数组函数printArray: 遍历数组并打印每个元素,便于查看排序结果。...主函数main: 初始化一个整数数组并计算其大小。 调用selectionSort函数对数组进行排序。 打印排序前后的数组。...= i; for (int j = i+1; j j++) { if (arr[j] arr[min_idx])...min_idx = j; } // 仅在需要时才进行交换 if (min_idx !
arr[j+1] = temp; } } } } 思路:从后面开始进行比较交换操作,此时i后面到数组开头元素都是有序序列,而从位置i起到数组结尾都是无序元素,内存循环每一次从数组尾部两两比较...,而选择排序不断进行比较而非交换操作,最终找到最小值后,赋值给当前i对应的值,相当于省去了交换的时间损耗 //简单选择排序 void SelectSort(int arr[], int len) {...) { if (arr[min] > arr[j]) { min = j;//找到比当前min位置更小的值,更小j的值 } } //如果当前i位置就是最小值,就不进行交换操作...= min) { int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } 思路:相对于初级版的冒泡排序(交换排序...,在通过数组元素后移,将无序元素插入其中 low = 0; high = i - 1; temp = arr[i]; //最后退出while循环的时候,low>high //high
//如果在结果数组result中没有找到arr[i],则把arr[i]压入结果数组result中 if (result.indexOf(arr[i]) == -1) result.push...length,就把arr[i],压入数组result //j等于result的length,说明遍历到了最后,也就是没有找到相同的元素 if(j===result.length...} } //如果结果数组result中的一个元素,不等于,调用unique4()方法的数组的其中一个元素,repeat值为false,把元素添加到结果数组...arr[i]; //如果hash对象中的key属性值不等于1(说明hash对象中不存在key属性),就把arr[i]压入结果数组result,同时设置hash的key属性值为1 if(hash[...解释 这次终于是不一样了,思路已经换了,这次需要先把数组排序,这点很重要,排序之后,再进行比较,比较的是,调用方法的数组和结果数组,其实也就是在比较调用方法的数组中的,第i项和第i-1项,如果相等
冒泡排序 通过相邻元素的比较和交换,使得每一趟循环都能找到未有序数组的最大值或最小值。...len) { return []; } console.log('原始数组:', arr); //外循环,对被排序的数组进行遍历,轮数为数组的长度 for...len) { return []; } console.log('原始数组:', arr); //外循环,对被排序的数组进行遍历,轮数为数组的长度 for (let i = 0;...arr[minIndex]]//交换两个元素 } return arr; } 插入排序 思路:以第一个元素为有序数组,其后的元素通过再这个已有序的数组中找到合适的元素并插入。...基数排序先按照最低有效位(LSB)对元素进行排序,然后依次按照次低有效位、次次低有效位……最高有效位进行排序。
,进行下次判断 } } } } 运行结果: 第一趟排序后的数组[3, -1, 9, -5, 11] 第二趟排序后的数组[3, -1, -5, 9, 11]...int min = arr[i]; for (int j = i + 1; j arr.length; j++) { if (min > arr...//从第gap个元素,逐个对其所在的组进行直接插入排序 for (int i = gap; i arr.length; i++) { int...基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列...]之前,则称这种排序算法是稳定的;否则称为不稳定的] 4)有负数的数组,我们不用基数排序来进行排序, 如果要支持负数,参考https://code.i-harness.com/zh-CN/q/e98fa9
领取专属 10元无门槛券
手把手带您无忧上云