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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

剑指offer-week1

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer-week1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、找出數組中的重復數字

描述
在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組[2,3,1,0,2,5,3],那么對應的輸出是2或者3。存在不合法的輸入的話輸出-1

數據范圍:
進階:時間復雜度,空間復雜度
輸入:[2,3,1,0,2,5,3]
返回值:2
說明:
2或3都是對的

采用重排數組的辦法,時間復雜度為O(n),空間復雜度為O(1);
首先,我們可以遍歷數組,若存在元素不在 0~n-1 的范圍內,直接返回 -1。
接著,再次遍歷數組,若下標 i 與對應元素 nums[i] 不同,即 nums[i] != i,我們應該把 nums[i] 這個元素交換到正確的位置 nums[i]上。交換前,先判斷 nums[i] 與 nums[nums[i]] 這兩個元素是否相同,相同說明存在重復元素,直接返回,否則進行 swap 交換。交換過后,我們需要再次判斷 i 位置上的元素,因此,我們使用 while 循環。
從頭到尾依次掃描數組中每一個數字。當掃描到第i個元素時,比較該位置數值m是否等于i。若是,接著掃描下一個數字;否則,將其與第m個數字進行比較。若相等,則返回該重復數字;否則,交換兩個數字,繼續重復前面的過程。

public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可 * @param numbers int整型一維數組 * @return int整型*/public int duplicate (int[] numbers) {// write code hereint n = numbers.length;int i =0;while(i<n){if(numbers[i]<0 || numbers[i]>=n)return -1;if(numbers[i]==i){i++;continue;}else{if(numbers[i]==numbers[numbers[i]]){return numbers[i];}int temp=numbers[i];numbers[i] = numbers[temp];numbers[temp] = temp;}}return -1;} }

二、不修改數組找出重復的數字

題目描述

在一個長度為n+1的數組里的所有數字都在1~n的范圍內,其中?。所以數組中至少有一個數字是重復的。請找出數組中任意一個重復的數字,但不能修改輸入的數組。例如,如果輸入長度為8的數組{2,3,5,4,3,2,6,7},那么對應的輸出是重復的數字2或者3。
測試用例
長度為n的數組中包含一個或多個重復數字
數組中不包含重復的數字
無效輸入測試用例(空指針)
本題的測試用例如下:

int main(){
// 測試用例:
Solution sol;

// 長度為n的數組中包含一個或者多個重復數 vector<int> nums1{1,2,3,4,5,5,6,6,7}; // expected output: 5/6 cout << sol.duplicateInArray(nums1) << endl;

?
vector nums2{3,1,2,3}; // expected output: 3
cout << sol.duplicateInArray(nums2) << endl;
?
vector nums3{1,1}; // expected output: 1
cout << sol.duplicateInArray(nums3) << endl;
}

哈希表:跟上一題一樣,本題也可以創建一個哈希表,如果原數組的每個數字第一次出現,就把他放到哈希表中去,即原數組大小為m的數字應該放到哈希表下標為m的位置上。空間復雜度是 。
1、二分法:那么有沒有不用空間復雜度 的算法。假設沒有重復數,那么 1~n 之間,每個數都只能出現一次。而題目中,這個數組至少有一個數字重復,即出現的次數大于1。
2、利用二分的思想:把 1~n 的數字從中間數字m開始分為兩部分,前一半為 1~ m,后面一半為 m+1 ~n,如果 1~m 中的數字在數組中出現的次數大于m,那么這一半必定有重復的數字;否則,那么另一部分必定含有重復數字。接著我們,繼續對含有重復數字的區間一分為二,直到找到重復的數字。

總結

以上是生活随笔為你收集整理的剑指offer-week1的全部內容,希望文章能夠幫你解決所遇到的問題。

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