Leetcode刷题计划一
刷题目标:
刷题计划:
前TOP100,学习java解题,每天2道题,先刷2遍,和小姐妹 互相监督。
数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,从简单刷起,再慢慢做中等、困难题目。
尽量不要用暴力!!! <hr style=” border:solid; width:100px; height:1px;” color=#000000 size=1”>
内容:
数组 1. 两数之和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Solution { public int [] twoSum(int [] nums, int target) { if (nums == null || nums.length == 0 ) return new int [0 ]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0 ; i < nums.length; i++) { map.put(nums[i], i); } for (int i = 0 ; i < nums.length; i++) { int x = nums[i]; if (map.containsKey(target - x)) { int index = map.get(target - x); if (i != index) return new int []{i, index}; } } return new int [0 ]; } }
53. 最大子序和
解题思路 对于含有正数的序列而言,最大子序列和肯定是正数,所以头尾肯定都是正数; 我们可以从第一个正数开始算起,每往后加一个数便更新一次和的最大值; 当前子序列和为负数时,则表明此前序列无法为后面提供最大子序列和,因此必须重新确定序列首项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution { public int maxSubArray (int [] nums) { int sum=0 ; int ans=nums[0 ]; for (int i=0 ;i<nums.length;i++){ if (sum>0 ){ sum+=nums[i]; }else { sum=nums[i]; } if (ans<=sum){ ans=sum; } } return ans; } }
121. 买卖股票的最佳时机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Solution { public int maxProfit (int prices[]) { int minprice = Integer.MAX_VALUE; int maxprofit = 0 ; for (int i = 0 ; i < prices.length; i++) { if (prices[i] < minprice) { minprice = prices[i]; } else if (prices[i] - minprice > maxprofit) { maxprofit = prices[i] - minprice; } } return maxprofit; } }
169. 多数元素
1 2 3 4 5 6 class Solution { public int majorityElement (int [] nums) { Arrays.sort(nums); return nums[nums.length/2 ]; } }
283. 移动零
先统计非零元素个数,再将非零的紧凑的重新分配到数组,剩下的直接赋值0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public void moveZeroes (int [] nums) { int cnt=0 ; for (int i=0 ;i<nums.length;i++){ if (nums[i]!=0 ) cnt++; } int index=0 ; for (int i=0 ;i<nums.length;i++){ if (nums[i]!=0 ) { nums[index]=nums[i]; index++; } } for (int i=index;i<nums.length;i++){ nums[i]=0 ; } } }
448. 找到所有数组中消失的数字
遍历数组,将每个数字交换到它理应出现的位置上,下面情况不用换: 当前数字本就出现在理应的位置上,跳过,不用换。 当前数字理应出现的位置上,已经存在当前数字,跳过,不用换。 再次遍历,如果当前位置没对应正确的数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution { public List<Integer> findDisappearedNumbers (int [] nums) { List<Integer> res = new ArrayList<>(); int num; for (int i = 0 ; i < nums.length ; i++){ num = Math.abs(nums[i])-1 ; if (nums[num] > 0 ){ nums[num] *= -1 ; } } for (int i=0 ; i < nums.length ; i++){ if (nums[i] > 0 ){ res.add(i+1 ); } } return res; } }
<hr style=” border:solid; width:100px; height:1px;” color=#000000 size=1”>
总结:
复习了java一些语法,忘性太快了。
在做题时,总是用暴力简单思维,以后多学习题解中动规,dp,容器巧妙解决的思路吧。
自律不行他律!