1.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。
輸入[0,0,1,1,1,2,2,3,3,4],
函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
思路解析:利用slow=0,fast=1,分別指向陣列的第0,1號元素,if(他們相同時),,else
public static int removeduplicates(int nums)
} return slow + 1;
}
2.給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。
輸入:
[1,2,3,4,5,6,7]
和 k = 3
輸出:
[5,6,7,1,2,3,4]
說明:.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
.要求使用空間複雜度為 o(1) 的原地演算法。
思路解析:元素後移k次就行了,另一種是利用翻轉,任何陣列翻轉3次即可,還有一種思路新奇
/**
* 翻轉
* 時間複雜度:o(n)
* 空間複雜度:o(1)
*/public void rotate_2(int nums, int k)
private void reverse(int nums, int start, int end)
}/**
* 迴圈交換
* 時間複雜度:o(n^2/k)
* 空間複雜度:o(1)
*/public void rotate_3(int nums, int k)
}}
3.給定乙個整數陣列,判斷是否存在重複元素。
如果任何值在陣列**現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。
輸入: [1,2,3,1]
輸出: true
輸入: [1,2,3,4]
輸出: false
思路解析:我做的是排序然後比較,還有set也比較容易想到,以及map的containkey方法
public boolean containsduplicate(int nums)
4.給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
輸入: [2,2,1]
輸出: 1
思路解析:運用" ^ "運算子,異或的運算方法是乙個二進位制運算: 1^1=0 ;0^0=0 ;1^0=1 ;0^1=1
public int singlenumber(int nums) else if (nums1[i] > nums2[j]) else
} int res = new int[list.size()];
for (int i = 0; i < list.size(); i++)
return res;
}
6.給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位, 陣列中每個元素只儲存乙個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。
思路解析:如果是9,就相當於該位為0,前一位加1,直到第一位判定是否需要擴容
public int plusone(int digits) else
} int res=new int[len+1];
res[0]=1;
return res;
}
7.給定乙個陣列nums
,編寫乙個函式將所有0
移動到陣列的末尾,同時保持非零元素的相對順序。
輸入:
[0,1,0,3,12]
輸出:
[1,3,12,0,0]
說明:. 必須在原陣列上操作,不能拷貝額外的陣列。
. 儘量減少操作次數。
思路解析:其他元素前移佔據0的位置,然後再來補0,還有一種就是利用雙指標交換後直接填充0,這裡的if(i!=j)是為了防止找到0之前i,j相同
public void movezeroes(int nums)
j++;
} while (i < nums.length) nums[i++] = 0;}//
public void movezeroes(int nums) else
}} }
return true;
}//暴力破解
public static boolean isvalidsudoku(char board)
for(int k = 8; k > i; k--)
for(int k = i + 1; k % 3 != 0; k ++)
}} }
return true;
}
10.給定乙個 n × n 的二維矩陣表示乙個影象。將影象順時針旋轉 90 度。
說明:你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另乙個矩陣來旋轉影象。
給定 matrix =
[ [1,2,3],
[4,5,6],
[7,8,9]
],原地旋轉輸入矩陣,使其變為:
[ [7,4,1],
[8,5,2],
[9,6,3]
]給定 matrix =
[ [ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
], 原地旋轉輸入矩陣,使其變為:
[ [15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
思路解析:左下右上連線,元素對換後再映象對稱,這種方法化繁為簡。
public void rotate(int matrix) else if (nums[l] + nums[r] < sum) else }}
}return ls;
}
12.給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。
輸入:
[ [1,1,1],
[1,0,1],
[1,1,1]
]輸出:
[ [1,0,1],
[0,0,0],
[1,0,1]
]高階:
乙個直接的解決方案是使用 o(mn) 的額外空間,但這並不是乙個好的解決方案。
乙個簡單的改進方案是使用 o(m + n) 的額外空間,但這仍然不是最好的解決方案。
你能想出乙個常數空間的解決方案嗎?
思路解析:利用乙個輔助陣列來標記為0的位置,再根據它來做替換。
public void setzeroes(int matrix)
return new arraylist(ans.values());
}
14.假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 o(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
思路解析:將陣列一分為二,其中一定有乙個是有序的,另乙個可能是有序,也能是部分有序。此時有序部分用二分法查詢。無序部分再一分為二,其中乙個一定有序,另乙個可能有序,可能無序。就這樣迴圈.
public int search(int nums, int target)
private int search(int nums,int target,int i,int j)
{ if(i>j) return -1;
int mid=i+(j-i)/2;
if(nums[mid]==target) return mid;
if(nums[i]15.給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列**現次數大於⌊ n/2 ⌋的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在眾數。
Java 演算法題筆記(二,二維陣列)
力扣刷到的一題,做一下筆記。思路先找出格仔裡所有腐爛的橘子,然後這些橘子每傳染一次,記深度 1 直到不能再傳染了為止,再去判斷這些橘子裡,是否還有好橘子,如果有則為不能完全傳染,返回 1 如果沒有則為能全部傳完,那就返回深度值。原來,dr,dc 是控制上下左右移動的,這裡寫的是上,左,下,右 pub...
陣列演算法題
思路 使用hashmap儲存,key是每個元素,value是乙個linkedlist,這個鍊錶儲存了key對應所有的元素 即相同的元素 最後遍歷找出linkedlist對應size最大的 public class getmostfrequentinarraylist int result 0 int...
java基礎演算法題
無論什麼時候,面試官都看重程式設計師的演算法基本功,這也是證明自己能力的最直接的方法,所以面試之前一定要多多溫習演算法,最近因為面試我簡單總結了幾個小演算法,編譯執行通過的,如果有什麼錯誤,歡迎指正 v 方法一 使用遞迴演算法 遞迴求階乘 param n return public int fac1...