​力扣解法汇总1053. 交换一次的先前排列

news/2024/7/3 2:32:16

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:

力扣


描述:

给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的、按字典序排列小于 arr 的最大排列。

如果无法这么操作,就请返回原数组。

示例 1:

输入:arr = [3,2,1]
输出:[3,1,2]
解释:交换 2 和 1

示例 2:

输入:arr = [1,1,5]
输出:[1,1,5]
解释:已经是最小排列

示例 3:

输入:arr = [1,9,4,6,7]
输出:[1,7,4,6,9]
解释:交换 9 和 7

提示:

  • 1 <= arr.length <= 104
  • 1 <= arr[i] <= 104

解题思路:

* 解题思路:
* 使用优先解的策略。
* 首先,替换的位置越靠后,字典序变动就越小。所以找到第一个arr[i]比arr[i + 1]小的数字进行替换。
* 其次,两个交换的位置index和maxIndex,arr[maxIndex]的值越大,则字典序变动越小,所以找到index后小于arr[index]的最大值。
* 最后,如果有多个这样的值,则取位置最靠前的。因为arr[index]>arr[maxIndex],所以maxIndex的位置越靠前,交换后的值越大。

代码:

public class Solution1053 {

    public int[] prevPermOpt1(int[] arr) {
        int index = arr.length - 2;
        for (int i = arr.length - 2; i >= 0; i--) {
            if (arr[i] > arr[i + 1]) {
                index = i;
                break;
            }
        }
        int maxIndex = 0;
        int max = 0;
        for (int i = arr.length - 1; i > index; i--) {
            int value = arr[i];
            if (value >= arr[index]) {
                continue;
            }
            if (value >= max) {
                maxIndex = i;
                max = value;
            }
        }
        int local = arr[index];
        arr[index] = arr[maxIndex];
        arr[maxIndex] = local;
        return arr;
    }
}


http://lihuaxi.xjx100.cn/news/1001960.html

相关文章

gtk / gtkmm学习记录

参考资料 https://github.com/ToshioCP/Gtk4-tutorial/blob/main/gfm 第一个程序 1. 创建一个程序 #include <gtk/gtk.h>int main (int argc, char **argv) {GtkApplication *app gtk_application_new ("com.hello", G_APPLICATION_DEFAULT_FLAGS);int st…

idea查看java源码

idea查看java源码idea查看源码时总是出现 .class而不是 .java源码方法一&#xff1a;Ctrl&#xff0b;Alt&#xff0b;B查阅源码方法二&#xff1a;Ctrl&#xff0b;鼠标点击设置查看源码查看工具idea查看源码时总是出现 .class而不是 .java源码 方法一&#xff1a; Ctrl&…

排序算法之希尔排序

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;快给我点赞赞&#x1f497; 文章目录1. 希尔排序2. 算法思路3. 算法实现4. 算法性能分析&#x1f49e;总结&#x1f49e;1. 希尔排…

O2O、C2C、B2B、B2C是什么意思

一.O2O、C2C、B2B、B2C的区别在哪里&#xff1f; o2o 是 online to offline 分为四种运营模式 1.online to offline 是线上交易到线下消费体验 2.offline to online 是线下营销到线上交易 3.offline to online to offline 是线下营销到线上交易再到线下消费体验 4.online …

xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享

缺失了xinput1_3.dll文件&#xff0c;对应用程序或游戏的正常运行造成了严重的影响。这个动态链接库文件&#xff08;DLL&#xff09;是由Microsoft Corporation开发的&#xff0c;它是一个重要的Windows系统文件&#xff0c;提供了针对Xbox 360控制器的输入支持。如果这个文件…

PHP面向对象编程基础(一)

PHP面向对象编程基础 在PHP中&#xff0c;面向对象编程是一种非常常见的编程范式。它允许我们将代码组织成可重用和可扩展的类和对象&#xff0c;并提供了许多强大的功能&#xff0c;例如封装、继承和多态性。 类和对象 在PHP中&#xff0c;类是一种定义对象的蓝图或模板。它…

配置提取到配置类中,并且注入到spring容器

Data ConfigurationProperties(prefix "solr.config") EnableConfigurationProperties({CustomSolrConfigPathProperties.class}) Component public class CustomSolrConfigPathProperties {/*** 上传的配置文件的路径*/private String path;/*** 删除文件的父路径*…

不要图片?CSS实现大屏常见不规则边框(系列二)

前言 &#x1f44f;不要图片&#xff1f;CSS实现大屏常见不规则边框&#xff08;系列二&#xff09;&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现原理 系列一已经陈述了相关原理&#xff0c;感兴趣的小伙伴直接参…