第19天--算法(Leetcode 38,41,42)
38.外观数列
public String countAndSay(int n) { if(n < 1) { return ""; } if(n == 1) { return "1"; } char[] pre = countAndSay(n - 1).toCharArray(); int times = 1; StringBuilder sb = new StringBuilder(); for(int i = 1;i < pre.length;i ++) { if(pre[i - 1] == pre[i]) { times ++; }else { sb.append(times); sb.append(pre[i - 1]); times = 1; } } sb.append(times); sb.append(pre[pre.length - 1]); return sb.toString(); } 41.缺失的第一个正数 public int firstMissingPositive(int[] nums) { int left = 0; int right = nums.length; while(left < right) { if(nums[left] == left + 1) { left ++; }else if(nums[left] <= left || nums[left] > right || nums[nums[left] - 1] == nums[left]) { swap(nums,left,-- right); }else { swap(nums,left,nums[left] - 1); } } return left + 1; } public void swap(int arr[],int x,int y) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } 42.接雨水 public int trap(int[] height) { if(height == null || height.length < 3) { return 0; } int N = height.length; int L = 1; int R = N - 2; int leftMax = height[0]; int rightMax = height[N - 1]; int res = 0; while(L <= R) { if(leftMax <= rightMax) { res += leftMax - height[L] < 0 ? 0 : leftMax - height[L]; leftMax = Math.max(leftMax,height[L]); L ++; }else { res += rightMax - height[R] < 0 ? 0 : rightMax - height[R]; rightMax = Math.max(rightMax,height[R]); R --; } } return res; }