給定陣列 a[0,1,..n-1],請構造乙個陣列 b[0,1,..n-1],其中元素 b[i]=a[0]a[1]。a[i-1]a[i+1]..a[n-1]。不能使用除法。 (注:b[0] = a[1] *a[2] *a[n-1], b[n-1] = a[0] *a[1] *a[n-2];.))
想法: 假設:
left[i] = a[0]*.a[i-1]right[i] = a[i+1]*.a[n-1]
所以:
b[i] = left[i] *right[i]
可以知道:
left[i+1] = left[i] *a[i]right[i] = right[i+1] *a[i+1]
b[0] 沒有左,b[n-1] 沒有右。
import j**a.util.arrays;public class solution int temp = 1; for(int i = n-2; i >= 0; i--)return b; }
輸入乙個整數陣列,並實現乙個函式來調整陣列中數字的順序,使所有奇數都在陣列的前半部分,所有偶數都在陣列的後半部分,奇數和奇數、偶數和偶數之間的相對位置保持不變。
想法:你需要乙個輔助陣列來儲存資料。
public class solution int i = 0; for(int k = 0; k < n; k++)for(int k = 0; k < n; k++)
輸入乙個矩陣並按從外到內的順時針順序列印出每個數字,例如,如果您輸入如下矩陣:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 然後列印出數字 1、2、3、4、8、12、16、15、14、 13, 9, 5, 6, 7, 11, 10
想法:定義四個邊界。 注意:每次移動後應決定退出。
import j**a.util.arraylist;public class solution top++;if(top>down) break;向下移動 for(int i = top; i <= down; i++)right--;if(left>right) break;移動 for for (int i = right;.) i>= left; i--)down--;if(top>down) break;向上移動 for(int i = down; i>= top; i--)left++;if(left>right) break; }return result; }
283.給定乙個 num 陣列,編寫乙個函式,將所有零移動到陣列的末尾,同時保持非零元素的相對順序。
輸入:[0,1,0,3,12]輸出:[1,3,12,0,0]。
描述:
您必須在原始陣列上工作,不能複製其他陣列。 儘量減少操作次數。 想法:
將非 0 數字移到前面,然後將後面的數字更改為 0
class solution }for(int i = index; i < nums.length; i++)
566.在MATLAB中,有乙個非常有用的函式Reshape,它將矩陣重塑為不同大小的新矩陣,但保留其原始資料。
給出乙個由二維陣列表示的矩陣,以及兩個正整數 r 和 c,分別表示要重建的矩陣的行數和列數。
重構後的矩陣需要以相同的行遍歷順序填充原始矩陣的所有元素。
如果給定引數的整形操作可行且合理,則輸出新的整形矩陣;否則,輸出原始矩陣。
輸入:nums = [[1,2], 3,4]]r = 1, c = 4輸出:[1,2,3,4]] 解釋:nums 的行遍歷結果為 [1,2,3,4]。新矩陣是乙個 1 * 4 矩陣,新矩陣由以前的元素值逐個填充,乙個接乙個。
想法:
遍歷。
class solution return result; }
485.給定乙個二進位陣列,計算其中連續 1 的最大數量。
輸入:[1,1,0,1,1,1]輸出:3說明:前兩位和後三位是連續的1,所以連續1的最大個數為3
想法:
兩個變數用於儲存當前連續數,另乙個變數用於儲存最大連續數。
class solution else cur = 0; }return max; }
編寫乙個有效的演算法來搜尋 m x n 矩陣中的目標值。 該矩陣具有以下屬性:
每行中的元素按從左到右的公升序排列。
每列的元素按從上到下的公升序排列。
給定目標 = 5,則返回 true。 給定 target = 20,則返回 false。
思路:從[0][n-1]的位置開始,如果目標值大於這個值,則增加行數,如果目標值小於這個值,則減去列數。
class solution return false; }
378.給定乙個 n x n 矩陣,其中每個行和列元素按公升序排序,找到矩陣中第 k 個最小的元素。
請注意,它是排序後的第 k 個次要元素,而不是第 k 個不同的元素。
matrix = [ 1, 5, 9], 10, 11, 13], 12, 13, 15]], k = 8, 返回 13。
想法:
二進位搜尋。 通過計算數量來查詢。
找到使其成立的最左邊邊框。
class solution if(cnt >= k) h = mid; else l = mid + 1; }return l; }
645.集合 s 包含從 1 到 n 的整數。 遺憾的是,由於資料錯誤,集合中的乙個元素被複製到集合中另乙個元素的值,導致集合丟失乙個整數和乙個元素被複製。
給定乙個 nums 陣列,它表示集合 s 中錯誤的結果。 您的任務是首先找到重複出現的整數,然後找到丟失的整數並將它們作為陣列返回。
輸入:nums = [1,2,2,4]輸出:[2,3]。
想法:
排序,首先查詢重複項。
缺少的是比較前後兩個值之間的差值是否大於 1
有兩種特殊情況,首先失蹤,最後失蹤。
類解決方案查詢缺失值 if(nums[i] -nums[i-1] >1) } 以確定缺失值是否是最後乙個 if(nums[nums.com.length-1] != nums.length) return new int;
輸入:[1,3,4,2,2]輸出:2
描述:
您無法更改原始陣列(假設該陣列是唯讀的)。 只能使用額外的 o(1) 空間。 時間複雜度小於 o(n2)。 陣列中只有乙個重複的數字,但可以重複多次。 想法:
如果小於或等於 mid 的數字數大於 mid,則重複數在 [l,mid] 中,也可能是 mid。
在這裡,二分法搜尋基於統計量的數量,這類似於問題 5。
class solution if(cnt>m) h = m; else l = m+1; }return l; }
667.給定兩個整數 n 和 k,您需要實現乙個包含從 1 到 n 的 n 個不同整數的陣列,同時滿足以下條件:
如果此陣列為 [a1, a2, a3, .]。an],然後是陣列 [|a1 - a2|, a2 - a3|, a3 - a4|, an-1 - an|] 應該有並且只有 k 個不同的整數;
如果有多個答案,您可以簡單地實現並返回其中任何乙個。
輸入:n = 3, k = 1輸出:[1, 2, 3]解釋:[1, 2, 3] 包含 3 個不同的整數,範圍從 1 到 3,而 [1, 1] 有且只有 1 個不同的整數:1輸入:n = 3,k = 2輸出:[1, 3, 2]解釋:[1, 3, 2] 包含 1-3 範圍內的 3 個不同整數,而 [2, 1] 有且只有 2 個不同的整數: 1 和 2
想法:
讓前 k+1 個元素構造 k 個不同的差值,序列為:1、k+1、2、k、3、k-1、.,k/2, k/2+1.
class solution for(int i = k+1; i < n; i++)return result; }
697.給定乙個僅包含非負數的非空整數陣列,陣列的度數定義為指數組中任何元素的最大頻率。
您的任務是找到與 nums 大小相同的最短連續度陣列,並返回其長度。
輸入:[1,2,2,3,1,4,2]輸出:6
想法:使用三個哈希圖,乙個用於儲存每個值的出現次數,乙個用於儲存數字最左邊的坐標,乙個用於儲存數字的最右邊坐標。
class solution return true; }
565.陣列 a,長度為 n 從 0 開始,包含從 0 到 n - 1 的所有整數。 找到最大的集合 s 並返回其大小,其中 s[i] = 並遵循以下規則。
假設索引為 i a[i] 的元素是 s 的第乙個元素,s 的下乙個元素應該是 a[a[i]],然後是 a[a[a[a[i]]],依此類推,直到 s 出現重複元素。
輸入:a = [5,4,0,3,1,6,2]輸出:4 解釋:a[0] = 5,a[1] = 4,a[2] = 0,a[3] = 3,a[4] = 1,a[5] = 6,a[6] = 2最長的 s[k]:s[0] = =
想法:
由於每個生成的鏈都是迴圈的,因此會標記已訪問的元素,並且下次不會再次訪問該元素,以避免冗餘。
class solution max = math.max(max,cnt); return max; }
769.陣列 arr 為 [0, 1, ., .]。arr.length - 1],我們將這個陣列拆分為幾個“塊”,並分別對塊進行排序。然後進行聯接,使聯接的結果與按公升序排序的原始陣列相同。
我們可以將陣列劃分為多少個塊?
輸入:arr = [4,3,2,1,0]輸出:1解釋:將陣列分成 2 個或更多塊不會產生所需的結果。 例如,除以 [4, 3], 2, 1, 0] 得到 [3, 4, 0, 1, 2],它不是有序陣列。輸入:arr = [1,0,2,3,4]輸出:4解釋:我們可以將其分成兩部分,例如[1,0],2,3,4]。但是,拆分為 [1, 0], 2], 3], 4] 會給出最大塊數。
想法:
記錄可在其原始位置或自身位置排序的元素數。
class solution return result; }
4.給定兩個大小為 m 和 n 的正序(從最小到最大)陣列,nums1 和 nums2。
求這兩個正序陣列的中位數,並要求演算法的時間複雜度為 o(log(m + n))。
您可以假設 nums1 和 nums2 不會同時為 null。
思路:陣列分割槽。
將兩個陣列分成兩部分,前者的最小值小於後者的最小值,並且長度相等。
以找到中位數。
class solution int m = nums1.length; int n = nums2.length; int left = 0, right = m, ansi = -1;median1:前一部分的最大值 median2:後一部分的最小值 int median1 = 0, median2 = 0; while (left <= right) else }return (m + n) %2 == 0 ? median1 + median2) / 2.0 : median1; }
189.給定乙個陣列,將陣列 k 位置中的元素向右移動,其中 k 是非負數。
想法:當場翻轉。
class solution private void reverse(int nums, int start, int end) }
48.給定 n n 的二維矩陣表示影象。 將影象順時針旋轉 90 度。
您必須就地旋轉影象,這意味著您需要直接修改輸入的 2D 矩陣。 請不要使用其他矩陣來旋轉影象。
想法:類似於順時針列印影象。
從外向內旋轉每一層。
class solution }private void rotate2(int[matrix, int left, int right, int top, int down)
41.給定乙個未排序的整數陣列,找到其中未出現的最小正整數。
輸入:[3,4,-1,1]輸出:2輸入:[7,8,9,11,12]輸出:1
您的演算法的時間複雜度應為 o(n),並且僅在常數級別使用額外的空間。
思路:原位交換,並將值對應於陣列的相應基數。
class solution }for (int i = 0; i < n; i++)return n + 1; }