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

LeetCode 670.最大交换 图解(附Java代码)

一、题目描述 给定一个非负整数,你至多可以交换一次数字任意两位。返回你能得到最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。...既然选择贪心,那么就可能想要挑出这个数组中最大交换到这个数前边一个位置。2736就是7最大,然后2交换。...在这里进行了三个变量初始化,一个是maxIndex(最大值下标索引),index1index2(需要交换两个索引) 我们先将maxIndex初始化为最后一个索引,在我们从后往前找时候不仅要记录这个...maxIndex变化,同时还要记录一下index1index2,这两个变量就是用来记录我们最后要交换两个,初始化都为-1。...我们希望是最后maxIndex值能越靠前放越好,所以我们使用index1index2记录下这两个需要交换坐标而不实际交换。 下面是遍历记录。

9210

理解堆排序原理

正是由于上面的这种性质,所以决定了堆结构可以采用数组来实现,此外,堆又分最大堆最小堆: 最大堆:每一个父节点值,都大于或等于左右两个子节点值。...这里以最大堆为例,首先给定一个无序数组,这里假设元素是[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),由于在比较交换时不记录状态,所以快排一样属于不稳定排序算法。

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

【Java入门】交换数组两个元素位置

在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(慧函数)更符合开发人员需求。

31450

【每日leetcode】39.调整数组顺序使奇数位于偶数前面

❝left, right双指针法,时间复杂度O(N),空间复杂度O(1) ——leetcode此题热评 ❞ 前言 哈喽,大家好,是一条。...调整数组顺序使奇数位于偶数前面 难度:简单 ❝ 输入一个整数数组,实现一个函数来调整该数组数字顺序,使得所有奇数位于数组前半部分,所有偶数位于数组后半部分。...❞ 如果左指针指向偶数,右指针指向奇数,则交换元素位置 如果左指针指向奇数,右指针指向偶数,则继续移动指针,不交换位置。..., int index2){ int temp = nums[index1]; nums[index1] = nums[index2]; nums[index2...⭐更多算法题欢迎关注专栏《leetcode》 ❞ 为了回馈各位粉丝,礼尚往来,给大家准备了一些算法教学视频电子书 需要小伙伴可以回复「算法」领取。

37710

二分查找相关算法题

2)排序数组某个数出现次数 转载请注明原博客地址:http://blog.csdn.net/gdutxiaoxu/article/details/51292440 下面来一一总结 1 旋转数组最小数字...二分查找法一样,用两个指针分别指向数组第一个元素最后一个元素。 我们注意到旋转之后数组实际上可以划分为两个排序数组,而且前面的子数组元素都大于或者等于后面子数组元素。...我们还可以注意到最小元素刚好是这两个数组分界线。我们试着用二元查找法思路在寻找这个最小元素。 首先我们用两个指针,分别指向数组第一个元素最后一个元素。...} indexMid = (index1 + index2) / 2; //如果下标为index1index2indexMid指向三个数字相等...,我们无法判断中间数字是位于前面的字数组还是后面的子数组,也就无法移动两个指针来缩小查找范围。

58910

剑指Offer面试题:7.旋转数组最小数字

在排序数组我们可以用二分查找法实现O(logn)查找。 二、解题思路 Step1.二分查找法一样,我们用两个指针分别指向数组第一个元素最后一个元素。...= 0; int index2 = numbers.Length - 1; // 把indexMid初始化为index1原因: // 一旦发现数组第一个数字小于最后一个数字...numbers[index2]) { // 如果index1index2指向相邻两个数, // 则index1指向第一个递增子数组最后一个数字..., // index2指向第二个子数组第一个数字,也就是数组最小数字 if (index2 - index1 == 1) {...:   (1)把indexMid初始化为index1原因:一旦发现数组第一个数字小于最后一个数字,表明该数组是排序,就可以直接返回第一个数字了。

31520

算法-旋转数组最小数字

上图中是一个原数组与旋转数组,我们可以发现,旋转数组两个排序好子序列{3,4,5}{1,2},我们要找数值1(最小值)是两个子序列分界值,也是第二个子序列第一个值。...,而该任务只是在旋转数组找最小,所以只有改一改二分规则,还是可以用。...首先让两个指针分别指向旋转数组第一个位置(0)最后一个位置(4),此时两个指针中间数是5,5>3&&5>2,5比p1指向数值(3)大,这说明中间数值(5)在第一个子序列{3,4,5},那么第二个子序列一定在...,两个指针在确定中间值,中间值与两个指针指向数值对比,以确定哪个指针移动到中间值以构建子表,最终查找结束条件是: 两个指针指向位置相差为1,p2指向数值为最小数字。...2.如果旋转数组第一个位置数字,最后一个位置数字,中间数字三者相等,该方法并不适用,此时只能顺序查找: ?

64550

前端学习数据结构与算法系列(五):冒泡排序理解与实现

本文采用图文方式讲解冒泡排序特点,分步骤讲解js实现思路以及相对应代码,欢迎各位感兴趣开发者阅读本文概念 从序列最右边开始比较相邻两个数字大小,再根据结果交换两个数字位置,重复这一操作算法即冒泡排序...比较完一轮后,如果当前轮数不等于序列长度,则继续从末尾开始比较。 图解示例 如图所示,将下列数字按从小到大顺序进行排列。 从数据末尾开始比较相邻两个数字大小 比较后,发现6<7,故交换位置。...实现思路 声明一个函数,参数为一个数组 初始化比较轮数为1 对数组进行遍历 在循环中获取当前比较值在数组下标:数组长度 - 当前循环次数 在循环中获取当前比较值左侧相邻值在数组下标:数组长度...[array[index1],array[index2]] = [array[index2],array[index1]] [arr[compareIndex],arr[...本来对单层冒泡很自信,认为单层效率肯定比双层效率高,结果啪啪打脸,网上双层循环在控制台跑了一遍,才发现简直就是垃圾。

69620

旋转数组最小数字

例如数组{3,4,5,1,2}为{1,2,3,4,5}一个旋转,该数组最小值为1. 实现数组旋转见左旋转字符串。 二分查找法一样,用两个指针分别指向数组第一个元素最后一个元素。...我们试着用二元查找法思路在寻找这个最小元素。 首先我们用两个指针,分别指向数组第一个元素最后一个元素。按照题目旋转规则,第一个元素应该是大于或者等于最后一个元素(这其实不完全对,还有特例。...我们可以把第二个指针指向该中间元素,这样同样可以缩小寻找范围。我们接着再用更新之后 两个指针,去得到比较新中间元素,循环下去。...2; //如果下标为index1index2indexMid指向三个数字相等,则只能顺序查找 if(numbers[index1] == numbers[index2] && numbers...[i]) result = numbers[i]; } return result; }  注意:当两个指针指向数字及他们中间数字三者相同时候,我们无法判断中间数字是位于前面的字数组还是后面的子数组

59580

js算法初窥01(排序算法01-冒泡、选择、插入)

下面我们为这个数组类添加各种排序方法。我们先从最简单开始。 1、冒泡排序   冒泡排序十分简单,就是比较数组任何两个相邻元素,如果第一个比第二个大,那么就交换两个元素位置。...这样,较大值得元素就会一点一点移动到正确位置,就像气泡升至表面一样。我们先来看一下代码。 //交换数组两个相邻元素方法,传入是相关数组,以及相邻两个元素下标。...var aux = array[index1]; array[index1] = array[index2]; array[index2] = aux; // 但是我们可以有更为简便方式来做到替换两个数组元素位置方式...开始两个元素,并且在删除位置插入index2index1以达到替换元素目的。   ...在简单啰嗦两句,其实在代码,我们声明了jtemp变量用来存储当前下标其所对应值。

31210

JS家排序算法

比如下图学习归并排序算法时,只看代码感觉怎么都理解不了,但是结合chrome自带断点调试功能,便很快理解了其中思想。 ? 冒泡排序 <!...当算法执行外循环第二轮时候,数字45已经是正确排序了。尽管如此,在后续 比较,它们还一直在进行着比较,即使这是不必要。 ..., index2) { var aux = array[index1]; array[index1] = array[index2]; array[index2...归并排序一样,快速排序也使用分治方法,将原始数组分 为较小数组(但它没有像归并排序那样将它们分割开)。 chromesort()方法是基于快速排序实现。 快速排序动图演示: ?...对"基准"左边右边两个子集,不断重复第一步第二步,直到所有子集只剩下一个元素为止。

1.7K80

LeetCode笔记:167. Two Sum II - Input array is sorted

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 分别一开始在14两个数字,因为1小于6-4,所以数组游标指向2,数组游标不变,此时2+4正好等于6,返回结果索引为24,而不是

19820

☆打卡算法☆LeetCode 99、恢复二叉搜索树 算法解析

恢复二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com) 2、题目描述 给你二叉搜索树根节点 root ,该树 恰好 两个节点值被错误地交换。...交换 2 3 使二叉搜索树有效。 二、解题 1、思路分析 这些题,真是直呼好家伙,非得让你把二叉搜索树整明白不可。 94.二叉树序遍历 给定二叉树根节点,返回中序遍历。...99.恢复二叉搜索树 给定二叉搜索树根节点,其中有两个节点值被错误交换,恢复这棵树。 OK,言归正传,还是这道题,这道题还可以使用序遍历,按照左子树→根子树→右子树顺序递归判断。...但是,这个时候有一个问题,如果我们进行序遍历得到值都是递增,但是题目说是错误交换两个节点值,这样就破坏了值序列递增性。...空间复杂度: O(N) 我们需要用nums数组存储书中序遍历列表。 三、总结 序遍历树,找到不满足值序列保存在一个nums数组,然后再去寻找被错误交换节点。

17540

leetcode 一些算法题及答案

两数之和 给定一个整数数组 nums 一个目标值 target,请你在该数组找出为目标值两个 整数,并返回他们数组下标。 你可以假设每种输入只会对应一个答案。...如果,我们将这两个数相加起来,则会返回一个新链表来表示它们。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。...寻找两个有序数组中位数 给定两个大小为 m n 有序数组 nums1 nums2。 请你找出这两个有序数组中位数,并且要求算法时间复杂度为 O(log(m + n))。...最接近三数之和 给定一个包括 n 个整数数组 nums 一个目标值 target。找出 nums三个整数,使得它们与 target 最接近。返回这三个数。...两两交换链表节点 给定一个链表,两两交换其中相邻节点,并返回交换链表。 你不能只是单纯改变节点内部值,而是需要实际进行节点交换

42420

备战蓝桥杯————双指针技巧巧解数组1

利用双指针技巧来解决七道与数组相关题目。 两数之和 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 不需要考虑数组超出新长度后面的元素

15910
领券