1. 程式人生 > >弗洛伊德判圈演算法

弗洛伊德判圈演算法

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.

Note:

  1. You must not modify the array (assume the array is read only).
  2. You must use only constant, O
    (1) extra space.
  3. Your runtime complexity should be less than O(n2).
  4. There is only one duplicate number in the array, but it could be repeated more than once.
這個問題的限制條件比較多。不能修改陣列元素,只能用常量空間,複雜度<O(n2).用鴿籠原理很好證明必有重複元素。把元素取值1到n看成n個籠子,n+1個數放到n個籠子必有重複。 舉個例子: 4,1,2,3,1 重複的元素構成環 1,2,3,4,5 4,1,2,3,1 1->4, 4->3,3->2,2->1所以1是重複的
     int next(int array[], int num) {
         return array[num];
    }

    public int findDuplicate(int[] nums) {
        int fast = nums[0], slow = nums[0];
        while (true) {
            slow = next(nums, slow);
            fast = next(nums, next(nums, fast));
            if (slow == fast) {
                fast = nums[0];
                while (fast != slow) {
                    fast = next(nums, fast);
                    slow = next(nums, slow);
                }
                return fast;
            }

        }
        
    }


相關推薦

演算法

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. As

最短路演算法

暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。 上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公路是單向的。我們現在需要求任意兩

(Floyd)演算法求圖的最短路徑

https://blog.csdn.net/jeffleo/article/details/53349825 弗洛伊德基本思想 弗洛伊德演算法作為求最短路徑的經典演算法,其演算法實現相比迪傑斯特拉等演算法是非常優雅的,可讀性和理解都非常好。 基本思想: 弗洛伊德演算法定義了兩個二維

Codeup 問題 B: 演算法7-16:最短路徑演算法

題目描述 在帶權有向圖G中,求G中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。 解決這個問題的一個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為O(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是O(n3

程式設計基礎26 演算法

題目描述 在帶權有向圖G中,求G中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。 解決這個問題的一個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為O(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是O(n3),但演算法的形式

最短路徑-Floyd()演算法

最短路徑-Floyd(弗洛伊德)演算法 簡介: 相較Dijkstra,Floyd是一個完全窮舉圖中每個點到末尾點的最短路徑 演算法思想: 按慣例說兩個工具 Path[MAX_SIZE][MAX_SIZE]:儲存所有的最短路徑(指向

拓撲排序以及迪傑斯特拉演算法演算法的一些例子(天勤資料結構)

拓撲排序核心演算法     在一個有向圖中找到一個拓撲排序的過程如下:     1)從一個有向圖中選擇一個沒有前驅(入度為0)的頂點輸出;     2)刪除1)中的頂點,並刪除從該頂點出發的全部邊;  

最短路徑(鄰接矩陣)(演算法

#include<bits/stdc++.h> #define MaxInt 1e8 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int VerTexType; typedef i

結點對最短路徑Floyd演算法解析

        暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。         上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公

最短路徑迪傑斯特拉演算法演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

最短路徑基礎演算法——

問題 A(1171): 【基礎演算法】最短路徑問題 時間限制: 1 Sec 記憶體限制: 64 MB 題目描述 平面上有n個點(n<=100),每個點的座標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,

演算法7-16:最短路徑演算法(模板)

題目描述 在帶權有向圖G中,求G中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。 解決這個問題的一個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為O(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是O(n3),但

演算法7-16:最短路徑演算法

題目描述 在帶權有向圖G中,求G中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。 解決這個問題的一個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為O(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是O(n3

codeup 問題 B: 演算法7-16:最短路徑演算法

                                 問題 B: 演算法7-16:弗洛伊德最短路徑演算法                                                                時間限制: 1 Sec  記憶

最短路徑 單源最短路徑Dijkstra(迪傑斯特拉)演算法 Floyd(演算法

兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如   1->3=10     1->2=2   2->3=5    這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到

資料結構篇:校園最短路徑導航(二:演算法理解與應用)

求最短路徑最常用的有迪傑斯特拉(Dijkstra)和弗洛伊德(Floyd)演算法兩種。本著簡潔為王道的信條,我選擇了Floyd演算法。 Floyd演算法 首先來看一個簡單圖,紅色標記代表在陣列的下標,橙色標記代表距離(邊權值) 我們用D[6][6]這個矩陣儲存兩點之間最短路徑,

說說演算法

弗洛伊德演算法,是當時集訓的時候學最短路問題的第一個演算法(去年寒假),當時學長直說這個演算法好寫、時間複雜度高,至於這個演算法是什麼原理卻沒有講。學長說,照著敲就可以,迴圈敲對了,就那麼神奇的對了,迴圈順序錯了,就神奇的WA了。 今年寒假,我也是學長了,逗比碩把最短路給我了,就變成這一週我要

Warshall(演算法

    簡介:Floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與Dijkstra演算法類似。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。eg:暑假,小哼準備去一些城市旅遊

資料結構之(圖最短路徑之)Floyd(演算法

1)弗洛伊德演算法是求圖最短路徑的另外一種演算法,其適用於求圖中任意兩節點之間最短路徑; 2)其基本思想也是動態規劃,時間複雜度是O(N^3),N代表節點個數; 3)動態規劃的實現步驟是:a)找出問題的最優子結構;b)根據最優子結構求出遞迴解;c)以自下而上的方式求出最優解

Floyd algorithm!!!!!(萬惡的演算法

        曾經有位滑稽的博主說過:搜尋就是優雅的暴力。今天他又要說,DP就是優雅地搜尋。         不是每一個弗洛伊德都寫演算法,也不是寫演算法的都叫弗洛伊德,還有一位人家寫性學三論去了。         這位弗洛伊德來歷不一般,斯坦福大學的教授,1978年的