LeetCodeHot 100 数组专题
LeetCode53.最大子数组和
/**
* 贪心
* @param nums
* @return
*/
public static int maxSubArray(int[] nums) {
int max=nums[0];
int cur=nums[0];
for(int i=1;i<nums.length;i++) {
cur=Math.max(cur+nums[i], nums[i]);
max=Math.max(max, cur);
}
return max;
}
LeetCode56.合并区间
public int[][] merge(int[][] intervals) {
//重写进行排序
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] m,int[] n) {
return m[0]-n[0];
}
});
//用堆模拟
Deque<int[]> stack = new ArrayDeque<>();
stack.push(intervals[0]);
for(int i=1;i<intervals.length;i++) {
if(stack.peek()[1]>=intervals[i][0]) {
int[] temp = stack.pop();
stack.push(new int[]{temp[0],Math.max(intervals[i][1], temp[1])});
}else {
stack.push(intervals[i]);
}
}
//组装成数组
int n = stack.size();
int[][] res = new int[n][2];
for(int i=n-1;i>=0;i--) {
int[] r= stack.pop();
res[i][0]=r[0];
res[i][1]=r[1];
}
return res;
}
LeetCode189.轮转数组
/**
* 原地轮转-》数组的三次反转
* @param nums
* @param k
*/
public void rotate(int[] nums, int k) {
k=k%nums.length;
//第一次反转-全部反转
reverse(nums,0,nums.length-1);
//第二次反转-前半部分反转
reverse(nums,0,k-1);
//第三次反转-后半部分反转
reverse(nums,k,nums.length-1);
}
/**
* 反转函数
* @param num
* @param start
* @param end
*/
public void reverse(int[] num,int start,int end) {
while(start<end) {
int temp = num[start];
num[start]=num[end];
num[end]=temp;
start++;
end--;
}
}
LeetCode238.除自己以外数组的乘积
/**
* 创建两个数组记录两边遍历结果
* @param nums
* @return
*/
public int[] productExceptSelf(int[] nums) {
if(nums.length<=1) {
return nums;
}
int [] l = new int[nums.length];
int [] r = new int[nums.length];
int [] res = new int[nums.length];
int sum=1;
for(int i=0;i<nums.length;i++) {
sum=sum*nums[i];
l[i]=sum;
}
sum=1;
for(int i=nums.length-1;i>=0;i--) {
sum=sum*nums[i];
r[i]=sum;
}
for(int i=0;i<nums.length;i++) {
if(i==0) {
res[i]=r[i+1];
}else if(i==(nums.length-1)) {
res[i]=l[i-1];
}else {
res[i]=l[i-1]*r[i+1];
}
}
return res;
}
LeetCode41.缺失的第一个正数
public static int firstMissingPositive(int[] nums) {
// 消灭所有小于等于0的数,避免干扰
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= 0) {
nums[i] = nums.length + 1;
}
}
// 进行负号标记
for (int i = 0; i < nums.length; i++) {
int num = Math.abs(nums[i]);
if (num <= nums.length) {
int temp = num - 1;
if (nums[temp] > 0) { // 避免重复标记
nums[temp] = -nums[temp];
}
}
}
// 遍历数组查找没有下标的位置
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return nums.length + 1;
}