由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一题
相关主题
再论 mini # of swaps to sort array.String permunation question (CS)
FLAGBR 面经+offer一个有关求最小word distance的面试题
FG面经和感想一个容易记忆的permutation算法
如何实现binary tree的从下到上的分层打印?一道msft的题
mirror 一个binary tree, 用non-recursive解法怎么做周末上道小题
刚做了一道有些怪异的题有人做Facebook Hacker Cup吗?
Populating Next Right Pointers in Each Node IIleetcode里面的Recover Binary Search Tree怎么用O(1)space
发个面试coding题,攒人品怎么理解递归解决的“swap every two elements in a linked list”?
相关话题的讨论汇总
话题: int话题: ar话题: arr话题: index话题: num
进入JobHunting版参与讨论
1 (共1页)
c*****a
发帖数: 808
1
careercup看到A家的题
An operation "swap" means removing an element from the array and appending
it at the back of the same array. Find the minimum number of "swaps" needed
to sort that array.
Eg :- 3124
Output: 2 (3124->1243->1234)
How to do it less than O(n^2) ?
f*********d
发帖数: 140
2
LIS nlogn
l*******b
发帖数: 2586
3
貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
3124 <- 3 在 2前面所以是4-2步
1672345 <- 6在5前面,所以就是 7 - 5 = 2步
1263745 <- 同样也是2步
14325 <- 3在2前面需要5-2 = 3步
c*****a
发帖数: 808
4

能展开说说吗

【在 f*********d 的大作中提到】
: LIS nlogn
f*********m
发帖数: 726
5
我想需要的swap数目等于n-LIS吧?

【在 f*********d 的大作中提到】
: LIS nlogn
p*****2
发帖数: 21240
6
longest increase sequence
2341 需要3步吧

【在 f*********m 的大作中提到】
: 我想需要的swap数目等于n-LIS吧?
p*****2
发帖数: 21240
7
有说是连续得马

【在 l*******b 的大作中提到】
: 貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
: 3124 <- 3 在 2前面所以是4-2步
: 1672345 <- 6在5前面,所以就是 7 - 5 = 2步
: 1263745 <- 同样也是2步
: 14325 <- 3在2前面需要5-2 = 3步

p*****2
发帖数: 21240
8
require 'set'
def swapsort(arr)
sorted=arr.sort
pos={}
sorted.each_with_index {|num, i| pos[num]=i}
set=Set.new
ret=0
curr=nil
arr.each do |num|
set< if pos[num] nil? || num ret=arr.length-pos[num]-1
curr=num
end
end
ret
end
l*******b
发帖数: 2586
9
算步数的话感觉不需要记录所有已出现的元素。记录最小的一个即可

【在 p*****2 的大作中提到】
: require 'set'
: def swapsort(arr)
: sorted=arr.sort
: pos={}
: sorted.each_with_index {|num, i| pos[num]=i}
: set=Set.new
: ret=0
: curr=nil
: arr.each do |num|
: set<
c*****a
发帖数: 808
10

二爷能发个java,c++类吗...
这语言太高级了,有些syntax我跪了

【在 p*****2 的大作中提到】
: require 'set'
: def swapsort(arr)
: sorted=arr.sort
: pos={}
: sorted.each_with_index {|num, i| pos[num]=i}
: set=Set.new
: ret=0
: curr=nil
: arr.each do |num|
: set<
相关主题
刚做了一道有些怪异的题String permunation question (CS)
Populating Next Right Pointers in Each Node II一个有关求最小word distance的面试题
发个面试coding题,攒人品一个容易记忆的permutation算法
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11

你是说哪一段?

【在 l*******b 的大作中提到】
: 算步数的话感觉不需要记录所有已出现的元素。记录最小的一个即可
p*****2
发帖数: 21240
12

就是 luckynoob的算法。但是我做的是数字不连续的。如果连续的就要容易些。

【在 c*****a 的大作中提到】
:
: 二爷能发个java,c++类吗...
: 这语言太高级了,有些syntax我跪了

l*******b
发帖数: 2586
13
def swapEndSort(a: List[Int]) = {
val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
if(i.isEmpty) 0
else a.length - i.get(0)._2 - 1
}
scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学
p*****2
发帖数: 21240
14

val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
这句话复杂度多少?

【在 l*******b 的大作中提到】
: def swapEndSort(a: List[Int]) = {
: val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: if(i.isEmpty) 0
: else a.length - i.get(0)._2 - 1
: }
: scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学

l*******b
发帖数: 2586
15
线性的,照着list一个一个往前找

【在 p*****2 的大作中提到】
:
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: 这句话复杂度多少?

s*****1
发帖数: 134
16
这题BFS行不行?
3124 有3个adjacent node
1243,3241,3142,
然后再BFS下去,
当然最好还有个hash table,因为可能之前出现过的会再次出现,如果再次出现的话,
Queue就不放进去了
c*****a
发帖数: 808
17
我照着luckynoob的算法写了出来...跑了几个test都正确...我不懂这算法啊
public static int numOfSwap(int[]ar){
List unorder = new ArrayList();
for(int i =0;i if(i+1ar[i+1])
unorder.add(ar[i]);
}
Collections.sort(unorder);
int biggestUnorder = unorder.get(unorder.size()-1);
if(biggestUnorder > ar[ar.length-1])
return biggestUnorder - ar[ar.length-1];
int smallestUnorder = unorder.get(0);
for(int i = ar.length-1;i>=0;i--){
if(smallestUnorder>ar[i])
return ar[i+1]-ar[i];
}
return -1;
}
f*********m
发帖数: 726
18
哦,我弄错了。

【在 p*****2 的大作中提到】
: longest increase sequence
: 2341 需要3步吧

l*******b
发帖数: 2586
19
数出来的是不需要动的。一旦动了i+1大小的元素,这个元素就被插到最后了。比它大
的必须都重新插入到最后

【在 c*****a 的大作中提到】
: 我照着luckynoob的算法写了出来...跑了几个test都正确...我不懂这算法啊
: public static int numOfSwap(int[]ar){
: List unorder = new ArrayList();
: for(int i =0;i: if(i+1ar[i+1])
: unorder.add(ar[i]);
: }
: Collections.sort(unorder);
: int biggestUnorder = unorder.get(unorder.size()-1);
: if(biggestUnorder > ar[ar.length-1])

j*****y
发帖数: 1071
20
那比如 4 3 2 1. 第一个 i + 1 在 i的前面的 i = 3, 4 在 3 前面, 这个就好像不
对了阿。

【在 l*******b 的大作中提到】
: 貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
: 3124 <- 3 在 2前面所以是4-2步
: 1672345 <- 6在5前面,所以就是 7 - 5 = 2步
: 1263745 <- 同样也是2步
: 14325 <- 3在2前面需要5-2 = 3步

相关主题
一道msft的题leetcode里面的Recover Binary Search Tree怎么用O(1)space
周末上道小题怎么理解递归解决的“swap every two elements in a linked list”?
有人做Facebook Hacker Cup吗?Binary Tree Maximum Path Sum非递归的怎么写
进入JobHunting版参与讨论
p*****2
发帖数: 21240
21

要找最小的。找到4,3还要继续往下找。

【在 j*****y 的大作中提到】
: 那比如 4 3 2 1. 第一个 i + 1 在 i的前面的 i = 3, 4 在 3 前面, 这个就好像不
: 对了阿。

c********t
发帖数: 5706
22
scala确实很酷,感觉以后会一统江湖

【在 l*******b 的大作中提到】
: def swapEndSort(a: List[Int]) = {
: val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: if(i.isEmpty) 0
: else a.length - i.get(0)._2 - 1
: }
: scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学

l*******b
发帖数: 2586
23
一统江湖估计不行,实用的functional programming总觉得值得学一下,好多概念不太
一样
haskell 总觉得离能用得上比较远,有个xmonad窗口管理器,很有意思。Scala 的包装
和c之类的还挺接近的,可能好学点

【在 c********t 的大作中提到】
: scala确实很酷,感觉以后会一统江湖
f*******t
发帖数: 7549
24
O(N)解思路是:
(首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
复杂度会升至O(NlogN),空间额外消耗O(N))
以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
到后面。所以1的index是几,就要移动几次。
找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
我们就要移几次。
依此类推,扫描一遍数组即能得出答案。
public int minSwap(int[] array) {
if (array == null || array.length < 2)
return 0;

int minSwap = 0;
int target = 1, index = 0;
while (index < array.length) {
if (array[index] == target) {
index++;
target++;
} else {
minSwap++;
index++;
}
}

return minSwap;
}
w***o
发帖数: 109
25
luckynoob的算法是对的。
具体实现可以这样:
1。对原数组排序,不过排序结果是index而不是value,比如:[4,3,2,1]排序后得
到[3,2,1,0],[2,3,7,4]排序后得到[0,1,3,2]
2。对index数组找到第一个降序元素的index i,比如[3,2,1,0]是1,[0,1,3,2]
是3
3。返回n-i
l*******b
发帖数: 2586
26
nice one!

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

b*******e
发帖数: 217
27
如果是随便取一堆不重复的数字排序后也可以?
what do you mean """排序后""""也可以做
y****n
发帖数: 743
28
你的思路是对的,算法是有问题的。
比如:1, 2, 1, 2
只需swap一次,你的算法返回2。
我找到的方法和你的几乎一样,只是需要扫描两遍。

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

y****n
发帖数: 743
29
这道题如果数组内容是杂乱的有重复依然可以O(N)搞定。

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

y****n
发帖数: 743
30
思路:
1. 逆序遍历,凡是比后面最小值min大的元素,都需要swap。
并且记录其中最小值swapMin。
2. 再次逆序遍历,把第一次没数过的并且比swapMin大的都需要swap。
假设输入参数不为空:
public static int MinSwap(int[] arr)
{
int swapCount = 0;
int swapMin = int.MaxValue;
int min = int.MaxValue;
for (int i = arr.Length - 1; i >= 0; i--)
if (arr[i] > min)
{
swapCount++;
if (arr[i] < swapMin)
swapMin = arr[i];
}
else if (arr[i] < min)
min = arr[i];
min = int.MaxValue;
for (int i = arr.Length - 1; i >= 0; i--)
{
if ((arr[i] <= min) && (arr[i] > swapMin))
swapCount++;
if (arr[i] < min)
min = arr[i];
}
return swapCount;
}
相关主题
问题:Find the minimum number of "swaps" needed to sort an arrayFLAGBR 面经+offer
minMSwap 这题能比O(n^2)更快的解法吗FG面经和感想
再论 mini # of swaps to sort array.如何实现binary tree的从下到上的分层打印?
进入JobHunting版参与讨论
c*****a
发帖数: 808
31
careercup看到A家的题
An operation "swap" means removing an element from the array and appending
it at the back of the same array. Find the minimum number of "swaps" needed
to sort that array.
Eg :- 3124
Output: 2 (3124->1243->1234)
How to do it less than O(n^2) ?
l*******b
发帖数: 2586
32
貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
3124 <- 3 在 2前面所以是4-2步
1672345 <- 6在5前面,所以就是 7 - 5 = 2步
1263745 <- 同样也是2步
14325 <- 3在2前面需要5-2 = 3步
c*****a
发帖数: 808
33

能展开说说吗

【在 f*********d 的大作中提到】
: LIS nlogn
f*********m
发帖数: 726
34
我想需要的swap数目等于n-LIS吧?

【在 f*********d 的大作中提到】
: LIS nlogn
p*****2
发帖数: 21240
35
longest increase sequence
2341 需要3步吧

【在 f*********m 的大作中提到】
: 我想需要的swap数目等于n-LIS吧?
p*****2
发帖数: 21240
36
有说是连续得马

【在 l*******b 的大作中提到】
: 貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
: 3124 <- 3 在 2前面所以是4-2步
: 1672345 <- 6在5前面,所以就是 7 - 5 = 2步
: 1263745 <- 同样也是2步
: 14325 <- 3在2前面需要5-2 = 3步

p*****2
发帖数: 21240
37
require 'set'
def swapsort(arr)
sorted=arr.sort
pos={}
sorted.each_with_index {|num, i| pos[num]=i}
set=Set.new
ret=0
curr=nil
arr.each do |num|
set< if pos[num] nil? || num ret=arr.length-pos[num]-1
curr=num
end
end
ret
end
l*******b
发帖数: 2586
38
算步数的话感觉不需要记录所有已出现的元素。记录最小的一个即可

【在 p*****2 的大作中提到】
: require 'set'
: def swapsort(arr)
: sorted=arr.sort
: pos={}
: sorted.each_with_index {|num, i| pos[num]=i}
: set=Set.new
: ret=0
: curr=nil
: arr.each do |num|
: set<
c*****a
发帖数: 808
39

二爷能发个java,c++类吗...
这语言太高级了,有些syntax我跪了

【在 p*****2 的大作中提到】
: require 'set'
: def swapsort(arr)
: sorted=arr.sort
: pos={}
: sorted.each_with_index {|num, i| pos[num]=i}
: set=Set.new
: ret=0
: curr=nil
: arr.each do |num|
: set<
p*****2
发帖数: 21240
40

你是说哪一段?

【在 l*******b 的大作中提到】
: 算步数的话感觉不需要记录所有已出现的元素。记录最小的一个即可
相关主题
如何实现binary tree的从下到上的分层打印?Populating Next Right Pointers in Each Node II
mirror 一个binary tree, 用non-recursive解法怎么做发个面试coding题,攒人品
刚做了一道有些怪异的题String permunation question (CS)
进入JobHunting版参与讨论
p*****2
发帖数: 21240
41

就是 luckynoob的算法。但是我做的是数字不连续的。如果连续的就要容易些。

【在 c*****a 的大作中提到】
:
: 二爷能发个java,c++类吗...
: 这语言太高级了,有些syntax我跪了

l*******b
发帖数: 2586
42
def swapEndSort(a: List[Int]) = {
val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
if(i.isEmpty) 0
else a.length - i.get(0)._2 - 1
}
scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学
p*****2
发帖数: 21240
43

val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
这句话复杂度多少?

【在 l*******b 的大作中提到】
: def swapEndSort(a: List[Int]) = {
: val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: if(i.isEmpty) 0
: else a.length - i.get(0)._2 - 1
: }
: scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学

l*******b
发帖数: 2586
44
线性的,照着list一个一个往前找

【在 p*****2 的大作中提到】
:
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: 这句话复杂度多少?

s*****1
发帖数: 134
45
这题BFS行不行?
3124 有3个adjacent node
1243,3241,3142,
然后再BFS下去,
当然最好还有个hash table,因为可能之前出现过的会再次出现,如果再次出现的话,
Queue就不放进去了
c*****a
发帖数: 808
46
我照着luckynoob的算法写了出来...跑了几个test都正确...我不懂这算法啊
public static int numOfSwap(int[]ar){
List unorder = new ArrayList();
for(int i =0;i if(i+1ar[i+1])
unorder.add(ar[i]);
}
Collections.sort(unorder);
int biggestUnorder = unorder.get(unorder.size()-1);
if(biggestUnorder > ar[ar.length-1])
return biggestUnorder - ar[ar.length-1];
int smallestUnorder = unorder.get(0);
for(int i = ar.length-1;i>=0;i--){
if(smallestUnorder>ar[i])
return ar[i+1]-ar[i];
}
return -1;
}
f*********m
发帖数: 726
47
哦,我弄错了。

【在 p*****2 的大作中提到】
: longest increase sequence
: 2341 需要3步吧

l*******b
发帖数: 2586
48
数出来的是不需要动的。一旦动了i+1大小的元素,这个元素就被插到最后了。比它大
的必须都重新插入到最后

【在 c*****a 的大作中提到】
: 我照着luckynoob的算法写了出来...跑了几个test都正确...我不懂这算法啊
: public static int numOfSwap(int[]ar){
: List unorder = new ArrayList();
: for(int i =0;i: if(i+1ar[i+1])
: unorder.add(ar[i]);
: }
: Collections.sort(unorder);
: int biggestUnorder = unorder.get(unorder.size()-1);
: if(biggestUnorder > ar[ar.length-1])

j*****y
发帖数: 1071
49
那比如 4 3 2 1. 第一个 i + 1 在 i的前面的 i = 3, 4 在 3 前面, 这个就好像不
对了阿。

【在 l*******b 的大作中提到】
: 貌似是这样,从1开始看第一个i+1 在i 的前面就需要n - i步。大家看对不对
: 3124 <- 3 在 2前面所以是4-2步
: 1672345 <- 6在5前面,所以就是 7 - 5 = 2步
: 1263745 <- 同样也是2步
: 14325 <- 3在2前面需要5-2 = 3步

p*****2
发帖数: 21240
50

要找最小的。找到4,3还要继续往下找。

【在 j*****y 的大作中提到】
: 那比如 4 3 2 1. 第一个 i + 1 在 i的前面的 i = 3, 4 在 3 前面, 这个就好像不
: 对了阿。

相关主题
一个有关求最小word distance的面试题周末上道小题
一个容易记忆的permutation算法有人做Facebook Hacker Cup吗?
一道msft的题leetcode里面的Recover Binary Search Tree怎么用O(1)space
进入JobHunting版参与讨论
c********t
发帖数: 5706
51
scala确实很酷,感觉以后会一统江湖

【在 l*******b 的大作中提到】
: def swapEndSort(a: List[Int]) = {
: val b = a.zipWithIndex.sortWith(_._1 < _._1).zipWithIndex
: val i = b.sliding(2).find(x => x(0)._1._2 > x(1)._1._2)
: if(i.isEmpty) 0
: else a.length - i.get(0)._2 - 1
: }
: scala里有些操作list的方法挺好用的,比c++里面强大许多,值得一学

l*******b
发帖数: 2586
52
一统江湖估计不行,实用的functional programming总觉得值得学一下,好多概念不太
一样
haskell 总觉得离能用得上比较远,有个xmonad窗口管理器,很有意思。Scala 的包装
和c之类的还挺接近的,可能好学点

【在 c********t 的大作中提到】
: scala确实很酷,感觉以后会一统江湖
f*******t
发帖数: 7549
53
O(N)解思路是:
(首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
复杂度会升至O(NlogN),空间额外消耗O(N))
以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
到后面。所以1的index是几,就要移动几次。
找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
我们就要移几次。
依此类推,扫描一遍数组即能得出答案。
public int minSwap(int[] array) {
if (array == null || array.length < 2)
return 0;

int minSwap = 0;
int target = 1, index = 0;
while (index < array.length) {
if (array[index] == target) {
index++;
target++;
} else {
minSwap++;
index++;
}
}

return minSwap;
}
w***o
发帖数: 109
54
luckynoob的算法是对的。
具体实现可以这样:
1。对原数组排序,不过排序结果是index而不是value,比如:[4,3,2,1]排序后得
到[3,2,1,0],[2,3,7,4]排序后得到[0,1,3,2]
2。对index数组找到第一个降序元素的index i,比如[3,2,1,0]是1,[0,1,3,2]
是3
3。返回n-i
l*******b
发帖数: 2586
55
nice one!

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

b*******e
发帖数: 217
56
如果是随便取一堆不重复的数字排序后也可以?
what do you mean """排序后""""也可以做
y****n
发帖数: 743
57
你的思路是对的,算法是有问题的。
比如:1, 2, 1, 2
只需swap一次,你的算法返回2。
我找到的方法和你的几乎一样,只是需要扫描两遍。

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

y****n
发帖数: 743
58
这道题如果数组内容是杂乱的有重复依然可以O(N)搞定。

【在 f*******t 的大作中提到】
: O(N)解思路是:
: (首先假定数组是1~n的某个排列,如果是随便取一堆不重复的数字排序后也可以做,
: 复杂度会升至O(NlogN),空间额外消耗O(N))
: 以3, 1, 2, 4为例,首先要找的是最小的数字,也就是1,在它前面的数字全部需要移
: 到后面。所以1的index是几,就要移动几次。
: 找到1以后再找2,如果2刚好在1的后面,那么我们不用移它,否则1与2之间有几个数,
: 我们就要移几次。
: 依此类推,扫描一遍数组即能得出答案。
: public int minSwap(int[] array) {
: if (array == null || array.length < 2)

y****n
发帖数: 743
59
思路:
1. 逆序遍历,凡是比后面最小值min大的元素,都需要swap。
并且记录其中最小值swapMin。
2. 再次逆序遍历,把第一次没数过的并且比swapMin大的都需要swap。
假设输入参数不为空:
public static int MinSwap(int[] arr)
{
int swapCount = 0;
int swapMin = int.MaxValue;
int min = int.MaxValue;
for (int i = arr.Length - 1; i >= 0; i--)
if (arr[i] > min)
{
swapCount++;
if (arr[i] < swapMin)
swapMin = arr[i];
}
else if (arr[i] < min)
min = arr[i];
min = int.MaxValue;
for (int i = arr.Length - 1; i >= 0; i--)
{
if ((arr[i] <= min) && (arr[i] > swapMin))
swapCount++;
if (arr[i] < min)
min = arr[i];
}
return swapCount;
}
s******t
发帖数: 229
60
那比如 3762514
第一个降序元素的index是5,返回7-5=2
总共换2次就行啦?怎么换啊

2]

【在 w***o 的大作中提到】
: luckynoob的算法是对的。
: 具体实现可以这样:
: 1。对原数组排序,不过排序结果是index而不是value,比如:[4,3,2,1]排序后得
: 到[3,2,1,0],[2,3,7,4]排序后得到[0,1,3,2]
: 2。对index数组找到第一个降序元素的index i,比如[3,2,1,0]是1,[0,1,3,2]
: 是3
: 3。返回n-i

1 (共1页)
进入JobHunting版参与讨论
相关主题
怎么理解递归解决的“swap every two elements in a linked list”?mirror 一个binary tree, 用non-recursive解法怎么做
Binary Tree Maximum Path Sum非递归的怎么写刚做了一道有些怪异的题
问题:Find the minimum number of "swaps" needed to sort an arrayPopulating Next Right Pointers in Each Node II
minMSwap 这题能比O(n^2)更快的解法吗发个面试coding题,攒人品
再论 mini # of swaps to sort array.String permunation question (CS)
FLAGBR 面经+offer一个有关求最小word distance的面试题
FG面经和感想一个容易记忆的permutation算法
如何实现binary tree的从下到上的分层打印?一道msft的题
相关话题的讨论汇总
话题: int话题: ar话题: arr话题: index话题: num