1.数组三元组

给一个n元数组s,找出是否有a+b+c=0的三元组,三元组不能重复,并且降序排列

  1. import java.util.*;
  2. public class Solution {
  3. public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
  4. //存放最终答案的二维数组
  5. ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
  6. int len = num.length;
  7. //特判:长度<3的数组不满足条件
  8. if(len<3){
  9. return ans;
  10. }
  11. //排序O(nlogn)
  12. Arrays.sort(num);
  13. for(int i=0;i<len;i++){
  14. //如果nums[i]已经大于0,就没必要继续往后了,因为和就是0啊
  15. if(num[i]>0){
  16. return ans;
  17. }
  18. //注意考虑越界i>0,主要功能是排除重复值
  19. if(i>0 && num[i]==num[i-1]){
  20. continue;
  21. }
  22. //声明指针
  23. int cur = num[i];
  24. int left = i+1;
  25. //从尾部开始
  26. int right =len-1;
  27. while(left<right){
  28. //满足条件的三数和
  29. int tp_ans = cur+num[left]+num[right];
  30. //如果已经找到和为0
  31. if(tp_ans==0){
  32. //创建一个数组,并将满足条件的三元素放进去
  33. ArrayList<Integer> list = new ArrayList<>();
  34. list.add(cur);
  35. list.add(num[left]);
  36. list.add(num[right]);
  37. //将最终的结果存入答案数组ans中
  38. ans.add(list);
  39. //判断是left指针指向是否重复
  40. while(left<right && num[left]==num[left+1]){
  41. left++;
  42. }
  43. //判断是right指针指向是否重复
  44. while(left<right && num[right]==num[right-1]){
  45. right--;
  46. }
  47. //移动指针
  48. left++;
  49. right--;
  50. }else if(tp_ans<0){
  51. left++;
  52. }else{
  53. right--;
  54. }
  55. }
  56. }
  57. return ans;
  58. }
  59. }

2.求数组中最长连续子序列

  1. public int MLS(int[] arr) {
  2. if (arr == null || arr.length == 0)
  3. return 0;
  4. int longest = 1;//记录最长的有序序列
  5. int count = 1;//目前有序序列的长度
  6. //先对数组进行排序
  7. Arrays.sort(arr);
  8. for (int i = 1; i < arr.length; i++) {
  9. //跳过重复的
  10. if (arr[i] == arr[i - 1])
  11. continue;
  12. //比前一个大1,可以构成连续的序列,count++
  13. if ((arr[i] - arr[i - 1]) == 1) {
  14. count++;
  15. } else {
  16. //没有比前一个大1,不可能构成连续的,
  17. //count重置为1
  18. count = 1;
  19. }
  20. //记录最长的序列长度
  21. longest = Math.max(longest, count);
  22. }
  23. return longest;
  24. }

3.求数组中最长递增子序列

如果有多个长度相等的答案,取最小的一个

  1. //set中last()返回最大,ceiling(k)返回大于等于k的最小元素,headSet(K)返回小于等于K的的set
  2. public int[] LIS (int[] temp) {
  3. int N = temp.length;
  4. int[] dp = new int[N];
  5. Arrays.fill(dp, 1);
  6. TreeSet<Integer> set = new TreeSet<>();
  7. set.add(temp[0]);
  8. for(int i = 1; i < dp.length; i++) {
  9. if(temp[i] > set.last()) {
  10. set.add(temp[i]);
  11. dp[i] = set.size();
  12. } else {
  13. int first = set.ceiling(temp[i]);
  14. set.remove(first);
  15. set.add(temp[i]);
  16. dp[i] = set.headSet(temp[i]).size() + 1;
  17. }
  18. }
  19. int[] res = new int[set.size()];
  20. for(int i = temp.length - 1, j = set.size(); i >= 0; i--) {
  21. if(dp[i] == j) {
  22. res[--j] = temp[i];
  23. }
  24. }
  25. return res;
  26. }

4.合并区间

合并重叠数组,如输入[[10,30],[20,60],[80,100],[150,180]],输出:[[10,60],[80,100],[150,180]]

  1. import java.util.*;
  2. public class Solution {
  3. public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
  4. Collections.sort(intervals, new Comparator<Interval>() {
  5. public int compare(Interval o1, Interval o2) {
  6. return o1.start-o2.start;
  7. }
  8. });
  9. for (int i = 1; i < intervals.size(); i++) {
  10. int preStart = intervals.get(i - 1).start;
  11. int preEnd = intervals.get(i - 1).end;
  12. int curStart = intervals.get(i).start;
  13. int curEnd = intervals.get(i).end;
  14. if (curStart <= preEnd) {
  15. intervals.set(i, new Interval(preStart, Math.max(preEnd, curEnd)));
  16. intervals.set(i - 1, null);
  17. }
  18. }
  19. while (intervals.remove(null)) ;
  20. return intervals;
  21. }
  22. }