1、两数之和
public int[] twoSum(int[] nums, int target) {
int [] result=new int[2];
HashMap map=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(!map.containsKey(target-nums[i])){
map.put(nums[i],i);
}else{
result[0]=(int)map.get(target-nums[i]);
result[1]=i;
}
}
return result;
}
containsKey
2、 字母异位词分组
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<>();
HashMap<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] chars = strs[i].toCharArray();
Arrays.sort(chars);
String key = new String(chars);
if (!map.containsKey(key)) {
List<String> list = new ArrayList();
list.add(strs[i]);
map.put(key, list);
} else {
List<String> addList = map.get(key);
addList.add(strs[i]);
}
}
for (Object o : map.keySet()) {
result.add(map.get(o));
}
return result;
}
new String(); 创建list集合、map集合等
3、最长连续序列
HashSet<Integer> set = new HashSet<>();
int res = 0;
for (int num : nums) {
set.add(num);
}
for (int i = 0; i < nums.length; i++) {
if (!set.contains(nums[i] - 1)) {
int curNum = nums[i];
int curLen = 1;
while (set.contains(curNum + 1)) {
curNum = curNum + 1;
curLen = curLen + 1;
}
res = Math.max(res, curLen);
}
}
return res;
4、移动零
public void moveZeroes(int[] nums) {
int left = 0;
if (nums.length == 0 || nums.length == 1) return;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
int temp = nums[i];
nums[i] = nums[left];
nums[left] = temp;
left++;
}
}
}
5、盛最多少的容器
public int maxArea(int[] height) {
int left=0;
int right=height.length-1;
int vol=0;
int result=0;
while(left<right){
if(height[left]>height[right]){
vol=(right-left)*height[right];
right--;
}else{
vol=(right-left)*height[left];
left++;
}
result=result>vol?result:vol;
}
return result;
}
6、三数之和
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
Arrays.sort(nums);
if(nums.length<3){
return res;
}
for(int i=0;i<nums.length-2;i++){
if (i > 0 && nums[i] == nums[i - 1]) {
continue; // 跳过重复元素
}
int left=i+1;
int right=nums.length-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]==0){
List<Integer> midList=new ArrayList<>();
midList.add(nums[i]);
midList.add(nums[left]);
midList.add(nums[right]);
res.add(midList);
while (left < right && nums[left] == nums[left + 1]) {
left++; // 跳过重复元素
}
while (left < right && nums[right] == nums[right - 1]) {
right--; // 跳过重复元素
}
right--;
left++;
}else if(nums[i]+nums[left]+nums[right]>0){
right--;
}else{
left++;
}
}
}
return res;
}
7、除自身以外数组的乘积
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[] res=new int[n];
int[] right=new int[n];
right[n-1]=1;
int[] left=new int[n];
left[0]=1;
for(int i=1;i<n;i++){
left[i]=left[i-1]*nums[i-1];
}
for(int i=n-2;i>=0;i--){
right[i]=right[i+1]*nums[i+1];
}
for(int i=0;i<n;i++){
res[i]=left[i]*right[i];
}
return res;
}
8、轮转数组
public void rotate(int[] nums, int k) {
if(k==nums.length) return;
resverse(nums,0,nums.length-1);
resverse(nums,0,(k-1)%nums.length);
resverse(nums,(k)%nums.length,nums.length-1);
}
public void resverse(int[] nums,int begin,int end){
while(begin<end){
int temp=nums[end];
nums[end]=nums[begin];
nums[begin]=temp;
begin++;
end--;
}
}
9、合并区间
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(int[] o1,int[] o2)->o1[0]-o2[0]);
LinkedList<int []> list=new LinkedList<>();
list.add(intervals[0]);
for(int i=1;i<intervals.length;i++){
int[] last=list.getLast();
if(intervals[i][0]<=last[1]){
last[1]=Math.max(intervals[i][1],last[1]);
}else{
list.add(intervals[i]);
}
}
return list.toArray(new int[0][0]);
}
10、最大子数组和
public int maxSubArray(int[] nums) {
int res=0;
int[] maxSum =new int[nums.length];
maxSum[0]=nums[0];
for(int i=1;i<nums.length;i++){
if(maxSum[i-1]>0){
maxSum[i]=maxSum[i-1]+nums[i];
}else{
maxSum[i]=nums[i];
}
}
Arrays.sort(maxSum);
return maxSum[nums.length-1];
}
11、矩阵置零
public void setZeroes(int[][] matrix) {
boolean[] row=new boolean[matrix.length];
boolean[] col=new boolean[matrix[0].length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
row[i]=true;
col[j]=true;
}
}
}
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(row[i]||col[j]){
matrix[i][j]=0;
}
}
}
}
12、螺旋矩阵
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list=new ArrayList<>();
int row=matrix.length;
int col=matrix[0].length;
int left=0;
int right=col-1;
int up=0;
int down=row-1;
while(list.size()<row*col){
if(up<=down){
for(int j=left;j<=right;j++){
list.add(matrix[up][j]);
}
up++;
}
if(left<=right){
for(int j=up;j<=down;j++){
list.add(matrix[j][right]);
}
right--;
}
if(up<=down){
for(int j=right;j>=left;j--){
list.add(matrix[down][j]);
}
down--;
}
if(left<=right){
for(int j=down;j>=up;j--){
list.add(matrix[j][left]);
}
left++;
}
}
return list;
}
13、旋转图像
class Solution {
public void rotate(int[][] matrix) {
int m=matrix.length;
for(int i=0;i<m;i++){
for(int j=i;j<m;j++){
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
for(int i=0;i<m;i++){
reserve(matrix[i],0,matrix[0].length-1);
}
}
public void reserve(int[] nums,int begin,int end){
while(begin<end){
int temp=nums[begin];
nums[begin]=nums[end];
nums[end]=temp;
begin++;
end--;
}
}
}
14、搜索二维矩阵
public boolean searchMatrix(int[][] matrix, int target) {
boolean res=false;
int m=matrix.length;
int n=matrix[0].length;
for(int i=0;i<m;i++){
for(int j=0;j<n;){
if(target==matrix[i][j]){
res=true;
return res;
}
if(target<matrix[i][j]){
break;
}
if(target>matrix[i][j]){
j++;
}
}
}
return res;
}
15、无重复字符的最长字串
16、找到字符串中的所有字母异位词
17、和为K的子数组
18、相交链表
19、反转链表
20、回文链表
21、环形链表
22、合并两个有序链表