一、题目描述 给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。...既然选择贪心,那么我就可能想要挑出这个数组中最大的值交换到这个数前边的一个位置。2736就是7最大,然后和2交换。...在这里我进行了三个变量的初始化,一个是maxIndex(最大值的下标索引),index1,index2(需要交换的值的两个索引) 我们先将maxIndex初始化为最后一个索引,在我们从后往前找的时候不仅要记录这个...maxIndex的变化,同时还要记录一下index1和index2,这两个变量就是用来记录我们最后要交换哪两个值的,初始化都为-1。...我们希望的是最后的maxIndex的值能越靠前放越好,所以我们使用index1和index2记录下这两个需要交换的坐标而不实际交换。 下面是遍历的记录。
正是由于上面的这种性质,所以决定了堆结构可以采用数组来实现,此外,堆又分最大堆和最小堆: 最大堆:每一个父节点的值,都大于或等于左右两个子节点的值。...这里以最大堆为例,首先给定一个无序的数组,这里我假设元素是[3,-1,4,6],要想使用堆排序,必须先把这个无序数组给构建成最大堆,在构建完毕后,root节点的值一定是最大的,然后取出最大值,放在原数组的尾部...代码已经准备好了,下面我们看看如何在Java中实现: public static void sort(int arr[]){ //初始化构建一个大顶堆 for (int...];//最大值,下标为0的永远是最大值 arr[index1]=arr[index2];//将最后一位数字与第一位替换 arr[index2]=tmp;//现在最后一位是最大的...,最坏及平均时间复杂度均为O(nlogn),空间复杂度为O(1),由于在比较和交换时不记录状态,所以和快排一样属于不稳定的排序算法。
在Java中,交换数组中的两个元素是基本的数组操作。下面我们将详细介绍如何实现这一操作,以及在实际应用中这种技术的重要性。一、使用场景在编程中,我们经常需要交换数组中的两个元素。...// 类名:ArrayFunction// 函数名:swap(T[] array, int index1, int index2)// 函数功能:交换数组中两个元素的位置 public class ArrayFunction...{ /** * 交换数组中两个元素的位置 * @param array 待交换元素的数组 * @param index1 第一个元素的下标 * @param index2...return array; } // 交换数组中两个元素的位置 T temp = array[index1]; array[index1] = array...健壮度:在函数中,对输入的参数做了两次检查(null和长度),确保了在函数体中操作的数组是有效的,增强了健壮度。综上,从封装性和可扩展性的角度考虑,FuncGPT(慧函数)更符合开发人员的需求。
❝left, right双指针法,时间复杂度O(N),空间复杂度O(1) ——leetcode此题热评 ❞ 前言 哈喽,大家好,我是一条。...调整数组顺序使奇数位于偶数前面 难度:简单 ❝ 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。...❞ 如果左指针指向偶数,右指针指向奇数,则交换元素位置 如果左指针指向奇数,右指针指向偶数,则继续移动指针,不交换位置。..., int index2){ int temp = nums[index1]; nums[index1] = nums[index2]; nums[index2...⭐更多算法题欢迎关注专栏《leetcode》 ❞ 为了回馈各位粉丝,礼尚往来,给大家准备了一些算法教学视频和电子书 需要的小伙伴可以回复「算法」领取。
2)排序数组中某个数的出现次数 转载请注明原博客地址:http://blog.csdn.net/gdutxiaoxu/article/details/51292440 下面我来一一总结 1 旋转数组的最小数字...和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素。 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。...我们还可以注意到最小的元素刚好是这两个子数组的分界线。我们试着用二元查找法的思路在寻找这个最小的元素。 首先我们用两个指针,分别指向数组的第一个元素和最后一个元素。...} indexMid = (index1 + index2) / 2; //如果下标为index1、index2和indexMid指向的三个数字相等...,我们无法判断中间的数字是位于前面的字数组还是后面的子数组中,也就无法移动两个指针来缩小查找的范围。
在排序的数组中我们可以用二分查找法实现O(logn)的查找。 二、解题思路 Step1.和二分查找法一样,我们用两个指针分别指向数组的第一个元素和最后一个元素。...= 0; int index2 = numbers.Length - 1; // 把indexMid初始化为index1的原因: // 一旦发现数组中第一个数字小于最后一个数字...numbers[index2]) { // 如果index1和index2指向相邻的两个数, // 则index1指向第一个递增子数组的最后一个数字..., // index2指向第二个子数组的第一个数字,也就是数组中的最小数字 if (index2 - index1 == 1) {...: (1)把indexMid初始化为index1的原因:一旦发现数组中第一个数字小于最后一个数字,表明该数组是排序的,就可以直接返回第一个数字了。
上图中是一个原数组与旋转数组,我们可以发现,旋转数组有两个排序好的子序列{3,4,5}和{1,2},我们要找的数值1(最小值)是两个子序列的分界值,也是第二个子序列的第一个值。...,而该任务只是在旋转数组中找最小,所以只有改一改二分的规则,还是可以用的。...首先让两个指针分别指向旋转数组的第一个位置(0)和最后一个位置(4),此时两个指针中间的数是5,5>3&&5>2,5比p1指向的数值(3)大,这说明中间的数值(5)在第一个子序列{3,4,5}中,那么第二个子序列一定在...,两个指针在确定中间值,中间值与两个指针指向的数值对比,以确定哪个指针移动到中间值以构建子表,最终查找结束的条件是: 两个指针指向的位置相差为1,p2指向的数值为最小数字。...2.如果旋转数组第一个位置的数字,最后一个位置的数字,中间数字三者相等,该方法并不适用,此时只能顺序查找: ?
本文采用图文的方式讲解冒泡排序的特点,分步骤讲解js的实现思路以及相对应的代码,欢迎各位感兴趣的开发者阅读本文概念 从序列的最右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置,重复这一操作的算法即冒泡排序...比较完一轮后,如果当前轮数不等于序列的长度,则继续从末尾开始比较。 图解示例 如图所示,将下列数字按从小到大的顺序进行排列。 从数据的末尾开始比较相邻两个数字的大小 比较后,发现6<7,故交换位置。...实现思路 声明一个函数,参数为一个数组 初始化比较轮数为1 对数组进行遍历 在循环中获取当前比较值在数组中的的下标:数组长度 - 当前循环次数 在循环中获取当前比较值左侧相邻值在数组中的下标:数组长度...[array[index1],array[index2]] = [array[index2],array[index1]] [arr[compareIndex],arr[...本来对我的单层冒泡很自信,认为我写的单层效率肯定比双层的效率高,结果啪啪打脸,我拿我写的和网上的双层循环在控制台跑了一遍,才发现我写的简直就是垃圾。
) 搜索(单词变换、排列组合) 三、例题 1、交换:把一个只包含01的串排序,可交换任意两个数的位置,最少需要多少次交换? ...思路:从两头往中间扫荡,扫荡过程中在左边遇到1就和右边遇到的0交换位置,直接到左有下标相遇时结束。..., int index2) { 28 char temp = chars[index1]; 29 chars[index1] = chars[index2]; 30...chars[index2] = temp; 31 } 输出结果如下: student a am I 5、子串变位词:给定两个串a和b,问b是否a的子串变位词。 ...对两个串中出现的字母统计,两串中相同的字母出现的次数一致则为变位词。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串。 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素。...我们试着用二元查找法的思路在寻找这个最小的元素。 首先我们用两个指针,分别指向数组的第一个元素和最后一个元素。按照题目旋转的规则,第一个元素应该是大于或者等于最后一个元素的(这其实不完全对,还有特例。...我们可以把第二个指针指向该中间元素,这样同样可以缩小寻找的范围。我们接着再用更新之后的 两个指针,去得到和比较新的中间元素,循环下去。...2; //如果下标为index1、index2和indexMid指向的三个数字相等,则只能顺序查找 if(numbers[index1] == numbers[index2] && numbers...[i]) result = numbers[i]; } return result; } 注意:当两个指针指向的数字及他们中间的数字三者相同的时候,我们无法判断中间的数字是位于前面的字数组还是后面的子数组中
下面我们为这个数组类添加各种排序方法。我们先从最简单的开始。 1、冒泡排序 冒泡排序十分简单,就是比较数组中任何两个相邻的元素,如果第一个比第二个大,那么就交换两个元素的位置。...这样,较大值得元素就会一点一点移动到正确的位置,就像气泡升至表面一样。我们先来看一下代码。 //交换数组中两个相邻元素的方法,传入的是相关的数组,以及相邻两个元素的下标。...var aux = array[index1]; array[index1] = array[index2]; array[index2] = aux; // 但是我们可以有更为简便的方式来做到替换两个数组元素位置的方式...开始的两个元素,并且在删除的位置插入index2,和index1以达到替换元素的目的。 ...我在简单的啰嗦两句,其实在代码中,我们声明了j和temp变量用来存储当前的下标和其所对应的值。
比如下图我学习归并排序算法时,只看代码感觉怎么都理解不了,但是结合chrome自带的断点调试功能,我便很快理解了其中的思想。 ? 冒泡排序 <!...当算法执行外循环的第二轮的时候,数字4和5已经是正确排序的了。尽管如此,在后续 比较中,它们还一直在进行着比较,即使这是不必要的。 ..., index2) { var aux = array[index1]; array[index1] = array[index2]; array[index2...和归并排序一样,快速排序也使用分治的方法,将原始数组分 为较小的数组(但它没有像归并排序那样将它们分割开)。 chrome的sort()方法是基于快速排序实现的。 快速排序动图演示: ?...对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2 大意: 给出一个递增排好序的整型数组,找出两个数组相加等于目标数字...函数 twoSum 应该返回两个数字的索引,index1 必须小于 index2。请注意你返回的结果(index1 和 index2)不是基于0开始的。 你可以假设每个输入都有一个结果。...输入:numbers={2, 7, 11, 15}, target=9 输出:index1=1, index2=2 思路: 最直接的方法是遍历每一个数,然后看它后面的每个数与它相加能不能等于目标数字...要利用好数组已经排好序的条件,两个数相加一定是一大一小相加得出目标数字,那么我们可以用两个游标,一个从数组头开始遍历,一个从数组尾开始遍历,如果数组头的数字小于目标数字减去数组尾的数字,则数组头的游标往后移动一格...举个例子,数组为 [1,2,3,4],目标数字为6,i 和 j 分别一开始在1和4两个数字,因为1小于6-4,所以数组头的游标指向2,数组尾的游标不变,此时2+4正好等于6,返回结果索引为2和4,而不是
大家好,又见面了,我是你们的朋友全栈君。 首先,什么是冒泡排序(BubbleSort)呢?...对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。...= arr.length - times ;i++ ){ if (arr[i-1] > arr[i]){ swap(arr,i-1,i); } } } } //交换数组中的两个元素...public static void swap(int[] arr,int index1,int index2){ int temp =arr[index1]; arr[index1] =...arr[index2]; arr[index2] = temp; } //打印元素的方法 public static void print(int[] arr){ System.out.print
恢复二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com) 2、题目描述 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。...交换 2 和 3 使二叉搜索树有效。 二、解题 1、思路分析 这些题,我真是直呼好家伙,非得让你把二叉搜索树整明白不可。 94.二叉树的中序遍历 给定二叉树的根节点,返回中序遍历。...99.恢复二叉搜索树 给定二叉搜索树的根节点,其中有两个节点的值被错误的交换,恢复这棵树。 OK,言归正传,还是这道题,这道题还可以使用中序遍历,按照左子树→根子树→右子树的顺序递归判断。...但是,这个时候有一个问题,如果我们进行中序遍历得到的值都是递增的,但是题目说的是错误的交换两个节点的值,这样就破坏了值序列的递增性。...空间复杂度: O(N) 我们需要用nums数组存储书中的中序遍历列表。 三、总结 中序遍历树,找到不满足的值序列保存在一个nums数组中,然后再去寻找被错误交换的节点。
中心思想是在使用数组存储的完全二叉树内从下往上每次构造大顶堆或者小顶堆,然后将找出来的堆顶数字放到数组结尾,剩下数组继续构造堆结构。..., int index2) { int temp = array[index1]; array[index1] = array[index2]; array...[index2] = temp; } 实现2 while循环,同样父子节点交换后记录被换过的子节点位置,使用while (2 * k + 1 <= lastIndex)循环判断对应的子树是否符合堆性质并调整..., int index2) { int temp = array[index1]; array[index1] = array[index2]; array...= array.length - 1 //所以(lastIndex+1)/2-1等于上层最后一个有子节点的节点在数组中的索引 //(lastIndex+1)/2-1=(lastIndex
两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。...如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。...寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。...最接近的三数之和 给定一个包括 n 个整数的数组 nums和 一个目标值 target。找出 nums中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。...两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
利用双指针技巧来解决七道与数组相关的题目。 两数之和 II - 输入有序数组: 给定一个按升序排列的数组,找到两个数使它们的和等于目标值。...利用双指针技巧,一个指针从数组的开头向后移动,另一个指针从数组的末尾向前移动,依次交换两个指针指向的元素。 最长回文子串: 找到给定字符串中的最长回文子串。...如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。...以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。...示例 1: 输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2 不需要考虑数组中超出新长度后面的元素
= function() { // 减少两个队列交换的次数, 只有当queue1为空时,交换两个队列 if(!..., index2) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data...) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1..., index2) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data..., index2) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data
1, 数组中不相同的元素的个数题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。...) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1...) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1...) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1...) {//交换堆中两个元素的位置 [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1
领取专属 10元无门槛券
手把手带您无忧上云