Soalan pertama leetcode, kaedah ini boleh mencapai penyelesaian kerumitan O(n)
Soalan memerlukan int[], seperti nombor = [2, 7, 11, 15] dan sasaran = 9.
Jika terdapat dua nombor yang jumlahnya ialah nilai sasaran, contohnya nums[0] + nums[1] = 2 + 7 = 9
kembali [0, 1].
Apabila menggunakan penyelesaian berikut, saya mempunyai sedikit keraguan, iaitu, peta cincang baharu dibuat, tetapi tiada nilai diberikan kepadanya Bagaimana anda mencapai keperluan soalan dalam kes ini?
public int[] twoSum(int[] numbers, int target) {
int[] result = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < numbers.length; i++) {
if (map.containsKey(target - numbers[i])) {
result[1] = i + 1;
result[0] = map.get(target - numbers[i]);
return result;
}
map.put(numbers[i], i + 1);
}
return result;
}
Bukankah map.put() dalam gelung for merupakan tugasan? ? ?
Soalan memerlukan jumlah dua nombor menjadi nilai sasaran dan nilai yang diberikan, maka anda mesti melintasi sekurang-kurangnya dua nombor
.(1) Jika anda memulakan dahulu, ia akan mengambil masa algoritma O(n); cari yang pertama Apabila nilainya betul, masa algoritma ialah O(k), 0<k<n Jumlah masa ialah O(n+k), untuk menentukan sama ada ia adalah diri anda sendiri, seperti (10 = 5 + 5 ).
Realisasi situasi ini ialah:
Nota: Traverse ke nombor pertama yang betul
Kesedaran situasi ini ialah:(2) Jika ia tidak dimulakan, ia akan merentasi ke nombor kedua yang betul sebelum berhenti Masa algoritma ialah O(k)(1<k<=n).
Tidak
Key
的情况下,HashMap.containsKey(Key)
返回的是false
不包括Key
.Tiada ralat penunjuk nol seperti yang anda fikirkan.