贪心算法求解边界最大数

贪心算法求解边界最大数(拼多多2504、排列问题)

多多有两个仅由正整数构成的数列 s1 和 s2,多多可以对 s1 进行任意次操作,每次操作可以置换 s1 中任意两个数字的位置。多多想让数列 s1 构成的数字尽可能大,但是不能比数列 s2 构成的数字大。请问在经过任意次操作后,满足上述条件的数列 s1 构成的数字是多少。

s1 = 21453

s2 = 14682

输出res = 14532

clike 复制代码
### 5.2 C++解决方案

时间复杂度:
最坏情况:O(n!)
平均情况:O(n^2) 到 O(n^3)
最好情况:O(n)
空间复杂度:O(n)

#include <algorithm>
#include <iostream>
#include <string>

// 全局变量,用于存储小于 s2 的 s1 的最大排列结果
std::string max_result = "";

// 回溯函数,用于生成 s 的所有排列并找出符合条件的最大排列
void backtrack(std::string &s, int index, const std::string &s2) {
  // 当 index 等于 s 的长度时,说明已经生成了一个完整的排列
  if (index == s.length()) {
    // 检查该排列是否小于 s2 且大于当前记录的最大排列 max_result
    if (s < s2 && s > max_result) {
      // 若满足条件,则更新 max_result
      max_result = s;
    }
    return;
  }

  // 记录当前位置可以使用的最大字符
  char max_char = s2[index];

  // 尝试将 s 中 index 位置及其后面的每个位置的字符与 index 位置交换
  for (int i = index; i < s.length(); ++i) {
    // 剪枝 如果当前字符大于目标字符,跳过
    if (s[i] > max_char)
      continue;

    // 交换 s[index] 和 s[i] 的位置
    std::swap(s[index], s[i]);

    // 剪枝 如果当前前缀小于目标前缀,继续递归
    if (s.substr(0, index + 1) <= s2.substr(0, index + 1)) {
      backtrack(s, index + 1, s2);
    }

    // 回溯操作,将字符交换回来
    std::swap(s[index], s[i]);

    //剪枝 如果已经找到了一个有效的排列,且当前字符等于目标字符,可以提前返回
    if (!max_result.empty() && s[i] == max_char) {
      break;
    }
  }
}

// 主函数,用于找出小于 s2 的 s1 的最大排列
int largest_less_than(const std::string &s1, const std::string &s2) {
  // 检查 s1 和 s2 的长度是否相等
  if (s1.length() > s2.length()) {
    return -1;
  }
  if(s1.length() < s2.length()){
    std::string s = s1;
    std::sort(s.begin(), s.end(), std::greater<char>());
    return stoi(s);
  }

  // 复制 s1 到 s 中,并对其进行降序排序
  std::string s = s1;
  std::sort(s.begin(), s.end(), std::greater<char>());

  // 调用回溯函数开始生成排列
  backtrack(s, 0, s2);

  // 返回结果
  return max_result.empty() ? -1 : std::stoi(max_result);
}

int main() {
  // 定义示例字符串 s1
  std::string s1 = "67433";
  // 定义示例字符串 s2
  std::string s2 = "14682";
  // 调用 largest_less_than 函数得到结果
  int res = largest_less_than(s1, s2);
  // 输出结果
  std::cout << "res = " << res << std::endl;
  return 0;
}
相关推荐
winner8881几秒前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
数据皮皮侠3 分钟前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora6 分钟前
Python 算法基础篇之链表
python·算法·链表
AI人工智能+电脑小能手9 分钟前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
科研前沿14 分钟前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算
bzmK1DTbd17 分钟前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
AI进化营-智能译站21 分钟前
ROS2 C++开发系列07-高效构建机器人决策逻辑,运算符与控制流实战
开发语言·c++·ai·机器人
winner888122 分钟前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
不会编程的懒洋洋32 分钟前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
直奔標竿33 分钟前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring