POJ:1833 按字典序找到下一个排列:
http://poj.org/problem?id=1833
按照字典的顺序(a-z) (1-9),可以得出任意两个数字串的大小。比如“123”, 最小的是“123”(从小到大),最大的是“321”(从大到小)。这样对于“123”的所有排列,可以得到按照字典序排序的有序集合 : 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1。
如果有n个数的排列,
1) 从最右边开始找,找到第一个 i ,使得arr[i] > arr[i-1];
2) 从 i 到 n 这个范围找到最小的比 arr[i-1] 大的数字,交换这个数和 arr[i-1];
3) 从 arr[i] 到 arr[n] 排序 qsort(arr, i, n);
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define N_MAX 1025
int n, k;
int a[N_MAX]; void printf_arr()
{
for (int i = ; i <= n; i++) {
printf("%d ", a[i]);
}
printf("\n");
} void qsort(int *a, int begin, int end)
{
if (begin >= end) return;
int l = begin, r = end, k = a[l];
while (l != r) {
while (l < r && k <= a[r]) r--;
while (l < r && k >= a[l]) l++;
if (l < r) {
int tmp = a[l];
a[l] = a[r];
a[r] = tmp;
}
}
a[begin] = a[l];
a[l] = k;
qsort(a, begin, l - );
qsort(a, l + , end);
} int main(int argc, char* argv[])
{
//setbuf(stdout, NULL);
//freopen("sample_input.txt", "r", stdin); int T = ;
scanf("%d", &T); while (T--) {
scanf("%d %d", &n, &k); for (int j = ; j <= n; j++) {
scanf("%d", &a[j]);
} while (k--) {
int i = n;
// step 1 : find a[i] > a[i - 1]
for (; i > ; i--) {
if (a[i] > a[i - ])
break;
}
// the biggest
if (i == ) {
for (int i = ; i <= n; i++) {
a[i] = i;
}
continue;
} // step 2 : find the min in [i, n]
int min = n;
int l = i - ;
int r = i;
for (int j = i; j <= n; j++) {
if (a[j] > a[l] && a[j] < min) {
min = a[j];
r = j;
}
} // step 2 : swap(min, a[i - 1])
int tmp = a[l];
a[l] = a[r];
a[r] = tmp; // step 3 : qsort [i, n]
qsort(a, i, n);
} printf_arr();
}
return ;
}
POJ:1833 按字典序找到下一个排列:的更多相关文章
- 31. Next Permutation (java 字典序生成下一个排列)
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- next_permutation():按字典序输出下一个排列
#include<iostream> #include<algorithm> using namespace std; int main() { int data[4]={5, ...
- leetcode 31. Next Permutation(字典序的下一个)
描述: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- POJ 1146 ID Codes 用字典序思想生成下一个排列组合
ID Codes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7644 Accepted: 4509 Descript ...
- LinkCode 下一个排列、上一个排列
http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列 ...
- [Swift]LeetCode31. 下一个排列 | Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Leetcode题库——31.下一个排列
@author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...
- 代码题(45)— 下一个排列、第k个排列
1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...
- 【LeetCode】下一个排列【找规律】
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
随机推荐
- centos7使用kubeadm安装部署kubernetes 1.14
应用背景: 截止目前为止,高热度的kubernetes版本已经发布至1.14,在此记录一下安装部署步骤和过程中的问题排查. 部署k8s一般两种方式:kubeadm(官方称目前已经GA,可以在生产环境使 ...
- Python与微信——itchat包
目录 itchat itchat 一安装itchat pip install itchat pip install echarts-python 二登陆并向文件传输助手发消息 import itcha ...
- linux下python安装
下载包: wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.gz 解压安装: tar -zvxf Python-3.6.3. ...
- 分布式协调服务Zookeeper扫盲篇
分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...
- [Android] Android 手机下 仿 微信 客户端 界面 -- 微聊
Android 手机下 仿 微信 客户端 界面 -- 微聊 (包括聊天列表 + 聊天对话页 + 朋友圈列表页 + 我的/发现 列表页) 项目演示: 功能说明: 1)底部标签切换 (TabHost + ...
- mp的猜猜看
~~~~|yjb1072452141---dc9339b4c33103abc4919375203e7a24|A1482583628---0142e0b6090b9b2838328445a79cd1b8 ...
- python excel写入及追加写入
# -*- coding:utf-8 _*- """ @author:Administrator @file: excel.py Description :如果行数是10 ...
- linux文件常用命令
文件管理不外乎文件或目录的创建.删除.查询.移动,有mkdir/rm/mv 2.1. 创建和删除 创建:mkdir 删除:rm 删除非空目录:rm -rf file目录 删除日志 rm *log (等 ...
- PostgreSQL中JSON、JSONB基本操作符
PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...
- 使用Github时遇到问题的解决方法
记录了一些我在使用Github时遇到问题的解决方法 git中报unable to auto-detect email address 错误的解决办法 问题描述: 执行 git commit -m &q ...