日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组——找重复元素

發布時間:2024/4/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组——找重复元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個數組,數組長度為n,元素值為1~n-1,也就是說這個數組里面至少有一個元素是重復的。找出一個重復的元素,并且把這個元素值返回。
例如:arr[5] = {1,3,4,2,2};返回2

本篇博客主要記錄以下三種方法:
1.元素對號入座(空間換時間)
2.在原數組上不斷操作,將元素換到對應的下標中
3.快慢指針

一、元素對號入座(空間換時間)

思路:由于數組大小為n,元素值為1~n-1,我們直接申請一個n大小的空間,將元素值賦值到申請的空間下標與其值相等的單元格中,如果沒有重復,正好一個單元格放一個元素(0下標沒有元素放),有重復,就會出現覆蓋的情況。
代碼:

//空間換時間,最壞時間復雜度O(n),空間復雜度S(n)int FindSameVal_2(int* arr, int len) {assert(arr != NULL);int* newdata = (int*)calloc(len, sizeof(int));assert(newdata != NULL);for (int i = 0; i < len; i++){if (newdata[arr[i]] != 0)//說明已經存在過arr[i]了{return arr[i];}else//將arr[i]的值放到對應的申請的空間中,在這里是將對應的空間置1{newdata[arr[i]] = 1;}} }

二、在原數組上不斷操作,將元素換到對應的下標中

思路:將0下標的值不斷的與其值相等的下標的值交換。
如下圖,arr[0] == 1,1本來應該放到arr[1]中的,所以就將arr[0]的值和arr[1]的值交換。其實和第一個方法一樣,也是交換一次,完成了對一個元素的歸位。這個沒有借助輔助空間。準確的說,只借助了arr[0],因為arr[0]不該有元素存放。

如下圖,將arr[0]的值與arr[2]的值交換

如下圖,將arr[0]的值與arr[3]的值交換

如下圖,當我們將arr[0]的值與arr[2]交換的時候,發現arr[2]的值就是2,說明值重復了。

代碼:

//最壞時間復雜度O(n),空間復雜度為S(1) int FindSameVal_1(int* arr, int len) {assert(arr != NULL);while (1){if (arr[0] == arr[arr[0]]){return arr[0];}else{swap(arr[0], arr[arr[0]]);}} }

三、快慢指針

首先要知道,如果元素存在重復的,那么將會存在環。(這里不著重驗證是否是環的問題)。
比如arr[7] = {1,2,4,6,3,5,4};
1->2->4->3->6->4->3->6->4…
以前面的值為下標確定箭頭后的值,結果發現3->6->4->3…構成環。
快慢指針是判斷環的最常用的方法。快慢指針原理點擊此處。
代碼:

//快慢指針 int FindSameVal_3(int* arr, int len) {assert(arr != NULL);int fast = 0;int slow = 0;do{slow = arr[slow];//slow走一步fast = arr[fast];fast = arr[fast];//fast走兩步//fast = arr[arr[fast]];} while (slow != fast);//第一次相遇fast = 0;while (slow != fast)//第二次相遇一定在環的形成點{slow = arr[slow];//慢指針在第一次相遇的地方繼續慢慢向后走fast = arr[fast];//fast從最初的地方和慢指針一樣慢走}return slow; }

總結

以上是生活随笔為你收集整理的数组——找重复元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。