有序陣列兩兩交換,求最小的交換次數。

2021-10-01 12:24:46 字數 858 閱讀 5454

1、有序陣列,按照0到n – 1的序列編號,順序打亂,請您用最小的交換操作次數,使其重新變成遞增序列。假如:編號儲存在乙個陣列array當中。一次交換操作可以將這個陣列的其中兩個數互換。

限制: 

1 <= n <= 100000    

例 1:

輸入: array = [2,0,1]

輸出: 2

解釋: 先交換0和2(一次交換操作),再交換1和2(一次交換操作)即可。

例 2:

輸入: array = [0,1,2,3,4]

輸出: 0

解釋: 不用任何交換。     

2、若初始序列為gbfcdae,那麼至少需要__次兩兩交換,才能使該序列變為abcdefg。任給乙個自由a--g這7個字母組成的排列,最壞的情況下需要至少__次兩兩交換,才能使序列變為abcdefg。

解題思路:求陣列中環的數量。

private static int function(int array) 

int count = 0;

int len = array.length;

int temp = new int[len];

for (int i = 0; i < len; i++) }}

return len - count;

}

思路解析:

1、首先,最多需要交換幾次?答案是n次,這很好想,把每個數放到本應在的地方,即使那個數本來就在那我們依舊算它交換一次,所以最多是n次。

然後,我們要找環,假設這個環有k個數,所謂的環就是這k個數可以不借助其他的數進行歸位,然後我們交換k-1次即可,可以發現每多乙個環就少一次交換,所以是n-環的數量。

2、

求兩個有序陣列兩兩相加的值最小的K個數

搜尋原題在這 題目描述 有兩個大小為n的有序陣列a b 從大到小 現在需要找出k個最大的數字,其中每個數字是這樣構成的 ai bj 0 i,j 例1 input a為7 6 5 4 b為4 3 2 1 k 4output 11 10 10 9 例2 input a為7 4 3 2 b為6 3 1 1...

兩兩交換鍊錶的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。例如 給定 1 2 3 4,你應該返回 2 1 4 3。在看到這道題目的時候,我感覺很簡單,可能就是邊界條件需要注意一下,我們需要乙個指標在整個鍊錶上進行移動,這個指標每次都是移動兩步。這樣的話基本就可以實現兩兩交換 如下 class sol...

兩兩交換鍊錶中的節點

給乙個鍊錶,兩兩交換其中的節點,然後返回交換後的鍊錶。樣例 給出 1 2 3 4,你應該返回的鍊錶是 2 1 4 3。遞迴方式 交換p 和 p.next 結點 swaphead p.next swaphead.next p definition for singly linked list.publ...