思路:
開始的時候,我想著可以用雜湊表的方法,一邊遍歷陣列,一邊在雜湊表中記錄出現的次數,時間複雜度是o(n),而且還利用了輔助空間,這種方法並不好。這裡可以,考慮二分查詢的思路,首先用二分查詢找出目標數字,這個時候我們可以寫兩個函式,乙個函式求最前面的數字,乙個函式求最後的數字(也就是第乙個3和最後乙個3)。當我們找到3的時候,先判斷它的前面乙個元素是不是3,如果不是,那麼它就是第乙個3,。如果它前面還是3,那麼就將要查詢的陣列的末尾元素更新為middleindex-1,繼續進行查詢。找最後乙個元素也是一樣的道理,只不過判斷的時候是判斷3後面是否還是3,其他的步驟同二分查詢一樣。要注意判斷目標數字的位置在首和尾的情況,這個要單獨進行判斷!
**:
int getfirstk(int*data, int length, int k,int start, int end)
else if (middledata > k)
end = middleindex - 1;
else
start = middleindex + 1;
return getfirstk(data, length, k, start, end); }
int getlastk(int*data, int length, int k, int start, int end)
int getnumberofk(int* data, int length, int k)
return number;
}
思路:
如果該陣列是未排序的,那麼可以按照等差數列求和公式求出沒有缺失數字的序列0~n-1的和,然後將缺失了數字的序列求和,這兩個數值的差就是缺失的數字。但是這道題目給了排序的條件,說明可以利用它來得到更好的演算法。其實還是利用了二分查詢的思路,如果數字沒有缺失,那麼對應的數字和在陣列裡的下標是相等的,比如0出現在下標為0的地方,5出現在陣列下標為5的地方。如果有乙個數字缺失了,那麼它的位置就會被比它大1的數字給佔據,而且這個數字之後的所有數字都和下標不相等了。利用這個特點,可以利用二分查詢,找出這個特殊位置數字,如果它前面的數字和序列相等,而它自己和下標不相等,那麼這個數字就是我們要找的數字。要注意**中對於首尾位置的特殊判斷。
**:
int getmissingnumber(const int*numbers, int length)
right = middle - 1;
}else
}if (left == length)//這裡要注意,如果恰好缺失的是n-1,那麼經過上面的迴圈
return -1;
}
題目三:陣列中數值和下標相等的元素
假設乙個單調遞增的陣列裡面每個元素都是整數並且是唯一的。請程式設計實現乙個函式,找出陣列中任意乙個數值都等於下標的元素。例如在陣列中,數字3和它的下標相等。
思路:注意到這是乙個遞增的陣列,可以發現,如果下標為i的數大於i,那麼它後面的數都會大於它們的下標;同理如果下標為i的數小於i,那麼它前面的數都會小於它們的下標。所以利用這個性質進行二分查詢就可以了。
**:
int getnumbersameasindex(const int*numbers, int length)
return -1;
}
劍指offer 陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 暴力查詢 不考慮二維陣列的有序性,兩重迴圈直接遍歷。public class solution ret...
劍指Offer 查詢陣列
兩種方法 第一種比較普遍的遍歷所有,那我們首先就需要確定從陣列的哪個地方開始查詢.比較好的位置就是從四個角開始搜尋.個人選了從右上角開始,沒啥原因,就是想而已,其他地方也可以,只不過是 的數字改變而已.public static boolean find1 int array int target ...
劍指offer 陣列 撲克牌順子
題目描述 ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,...