publicintmaxPerformance(int n, int[] speed, int[] efficiency, int k) { int mod=(int)1e9+7; int[][] arr=newint[n][2]; for (inti=0; i < n; i++) { arr[i][0]=efficiency[i]; arr[i][1]=speed[i]; } Arrays.sort(arr,(a,b)->(b[0]-a[0])); PriorityQueue<Integer> pq=newPriorityQueue<>(); long max=0; long sum=0; for (inti=0; i < n; i++) { int[] cur=arr[i]; int curEff=cur[0]; int curSpeed=cur[1]; sum+=curSpeed; pq.offer(curSpeed); if(pq.size()>k){ sum-=pq.poll(); } max=Math.max(max,sum*curEff); } return (int)(max%mod); }
1710. Maximum Units on a Truck
1 2 3 4 5 6 7 8 9 10 11 12
publicintmaximumUnits(int[][] boxTypes, int truckSize) { Arrays.sort(boxTypes,(a,b)->(b[1]-a[1])); int res=0; for (int[] box : boxTypes) { while(truckSize>0 && box[0]>0){ res+=box[1]; box[0]--; truckSize--; } } return res; }
publicint[] platesBetweenCandles(String s, int[][] queries) { int n=queries.length; int[] res=newint[n]; TreeMap<Integer,Integer> map=newTreeMap<>(); int idx=0; for (inti=0; i < s.length(); i++) { if(s.charAt(i)=='|'){ map.put(i,idx++); } } for (inti=0; i < n; i++) { int start=queries[i][0]; int end=queries[i][1]; Integer left=map.ceilingKey(start); Integer right=map.floorKey(end); if(left==null || right==null || left>=right){ res[i]=0; }else{ res[i]=right-left-(map.get(right)-map.get(left)); } } return res; }
2104. Sum of Subarray Ranges
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publiclongsubArrayRanges(int[] nums) { int n=nums.length; long res=0; for (inti=0; i < n; i++) { int min=nums[i]; int max=nums[i]; for (intj= i+1; j < n; j++) { min=Math.min(min,nums[j]); max=Math.max(max,nums[j]); res+=max-min; } } return res; }
publiclongminimumHealth(int[] damage, int armor) { Arrays.sort(damage); long left=0; long right=(long)1e10+1; int n=damage.length; while(left<right){ long mid=(left+right)/2; long hp=mid; for (inti=0; i < n; i++) { if(i==n-1){ hp-=Math.max(damage[i]-armor,0); }else{ hp-=damage[i]; } if(hp<=0){ break; } } if(hp<=0){ left=mid+1; }else{ right=mid; } } return left; }
1 2 3 4 5 6 7 8 9
publiclongminimumHealth(int[] damage, int armor) { long res=0; int maxD=0; for (int d : damage) { res+=d; maxD=Math.max(d,maxD); } return res-Math.min(armor,maxD)+1; }
2221. Find Triangular Sum of an Array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicinttriangularSum(int[] nums) { int n=nums.length; List<Integer> list=newArrayList<>(); for (inti=0; i < n; i++) { list.add(nums[i]); } while(list.size()>1){ List<Integer> next=newArrayList<>(); for (inti=0; i < list.size()-1; i++) { next.add((list.get(i)+list.get(i+1))%10); } list=next; } return list.get(0); }
int n=strength.length; long res=0; for (inti=0; i < n; i++) { for (intj=0; j <= i; j++) { res+=strength(j,i); } } int r=(int)(res%((int)Math.pow(10,9)+7)); return r; }
longstrength(int start,int end){
int min=Integer.MAX_VALUE; int sum=0; for (inti= start; i <= end; i++) { min=Math.min(min,nums[i]); sum+=nums[i]; } long res=min*sum;
publicintlongestLine(int[][] mat) { int row=mat.length; int col=mat[0].length; int[][][] dp=newint[row+1][col+2][4]; int max0=0; int max1=0; int max2=0; int max3=0; //horizontal, vertical, diagonal, anti-diagonal for (inti=0; i < row; i++) { for (intj=0; j < col; j++) { if(mat[i][j]==1){ dp[i+1][j+1][0]=dp[i+1][j][0]+1; max0=Math.max(max0,dp[i+1][j+1][0]); dp[i+1][j+1][1]=dp[i][j+1][1]+1; max1=Math.max(max1,dp[i+1][j+1][1]); dp[i+1][j+1][2]=dp[i][j][2]+1; max2=Math.max(max2,dp[i+1][j+1][2]); dp[i+1][j+1][3]=dp[i][j+2][3]+1; max3=Math.max(max3,dp[i+1][j+1][3]); } } } max0=Math.max(max0,max1); max0=Math.max(max0,max2); max0=Math.max(max0,max3); return max0; }
624. Maximum Distance in Arrays
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicintmaxDistance(List<List<Integer>> arrays) { int res=0; int min=arrays.get(0).get(0); int max=arrays.get(0).get(arrays.get(0).size()-1); int n=arrays.size(); for (inti=1; i < n; i++) { List<Integer> arr=arrays.get(i); res=Math.max(res,Math.abs(arr.get(arr.size()-1)-min)); res=Math.max(res,Math.abs(arr.get(0)-max)); min=Math.min(min,arr.get(0)); max=Math.max(max,arr.get(arr.size()-1)); } return res; }
643. Maximum Average Subarray I
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicdoublefindMaxAverage(int[] nums, int k) { double sum=0; int n=nums.length; for (inti=0; i < k; i++) { sum+=nums[i]; } double res=sum/k; for (inti= k; i < n; i++) { //[i-k+1,i] sum+=nums[i]; sum-=nums[i-k]; res=Math.max(res,sum/k); } return res; }
public double findMaxAverage(int[] nums, int k) {
double l = -10001, r = 100001;
while(l + 0.00001 < r) {
double m = l + (r - l) / 2;
if (canFindLargerAverage(nums, k, m)) {
l = m;
}
else {
r = m;
}
}
return l;
}
private boolean canFindLargerAverage(int[] nums, int k, double x) {
int n = nums.length;
double[] a = new double[n];
for (int i = 0; i < n; i++) {
a[i] = nums[i] - x;
}
double cur = 0, prev = 0;
for (int i = 0; i < k; i++) {
cur += a[i];
}
if (cur >= 0) {
return true;
}
for (int i = k; i < n; i++) {
cur += a[i];
prev += a[i - k];
if (prev < 0) {
cur -= prev;
prev = 0;
}
if (cur >= 0) {
return true;
}
}
return false;
}
publicintkthSmallestSubarraySum(int[] nums, int k) { //return the kth smallest subarray sum //=> return the smallest num satisfying that // k subarray sum <= num int lo=0; int hi= Arrays.stream(nums).sum(); while(lo<hi){ int mid=(lo+hi)>>1; if(countLessThan(nums,mid)<k){ //if not valid lo=mid+1; }else{ //if valid hi=mid; } } return lo; }
privateintcountLessThan(int[] nums, int target){ int l=0; int sum=0; int count=0; for (intr=0; r < nums.length; r++) { sum+=nums[r]; //[l,r] while(sum>target){ sum-=nums[l++]; } count+=r-l+1; } return count; }
public List<Integer> goodDaysToRobBank(int[] security, int time) { int n=security.length; int[] l=newint[n];//longest non-increasing subarray end with i int[] r=newint[n];//longest non-decreasing subarray start with i l[0]=1; for (inti=1; i < n; i++) { l[i]=security[i]<=security[i-1] ? l[i-1]+1 : 1; } r[n-1]=1; for (inti= n-2; i >= 0; i--) { r[i]=security[i]<=security[i+1] ? r[i+1]+1 : 1; } List<Integer> res=newArrayList<>(); for (inti=0; i < n; i++) { if(l[i]>time && r[i]>time){ res.add(i); } } return res; }
2294. Partition Array Such That Maximum Difference Is K
1 2 3 4 5 6 7 8 9 10 11 12 13
publicintpartitionArray(int[] nums, int k) { Arrays.sort(nums); int res=1; int n=nums.length; int start=0; for (inti=0; i < n; i++) { if(nums[i]-nums[start]>k){ res++; start=i; } } return res; }
publicintmaxFrequencyScore(int[] nums, int k) { int mod=(int)1e9+7; Map<Integer, List<Long>> map=newHashMap<>(); Map<Integer,Integer> cnt=newHashMap<>(); for (int num : nums) { cnt.put(num,cnt.getOrDefault(num,0)+1); } for (Integer num : cnt.keySet()) { int val=cnt.get(num); long pw=1; List<Long> list=newArrayList<>(); for (inti=0; i < val; i++) { pw=pw*num%mod; list.add(pw); } map.put(num,list); } int max=0; int left=0; int right=0; int n=nums.length; long sum=0; cnt.clear(); while(right<n){ //[left,right) int num=nums[right++]; if(cnt.containsKey(num)){ int val=cnt.get(num); //注意:减法时可能产生负数,需要加上mod来避免 sum=(sum-map.get(num).get(val-1)%mod+ map.get(num).get(val)%mod+mod)%mod; cnt.put(num,val+1); }else{ sum=(sum+map.get(num).get(0)%mod)%mod; cnt.put(num,1); } if(right-left>k){ int l=nums[left++]; int val=cnt.get(l); if(val==1){ sum=(sum-map.get(l).get(0)%mod)%mod; cnt.remove(l); }else{ //注意:减法时可能产生负数,需要加上mod来避免 sum=(sum-map.get(l).get(val-1)%mod+ map.get(l).get(val-2)%mod+mod)%mod; cnt.put(l,val-1); } } if(right-left==k){ max=Math.max(max,(int)sum); } } return max; }
2448. Minimum Cost to Make Array Equal
prefix sum of cost
still confusing: why Changing the elements into one of the numbers already existing in the array nums is optimal.
publiclongminCost(int[] nums, int[] cost) { int n=nums.length; int[][] arr=newint[n][2]; for (inti=0; i < n; i++) { arr[i][0]=nums[i]; arr[i][1]=cost[i]; } Arrays.sort(arr,(a,b)->(a[0]-b[0])); long[] prefix=newlong[n+1]; //cost sum of first i items for (inti=0; i < n; i++) { prefix[i+1]=prefix[i]+arr[i][1]; } long c=0; for (inti=1; i < n; i++) { c+=1L*(arr[i][0]-arr[0][0])*arr[i][1]; } long res=c; for (inti=1; i < n; i++) { long diff=arr[i][0]-arr[i-1][0]; //[0,i-1] c+=diff*prefix[i]; //[i,n-1] c-=diff*(prefix[n]-prefix[i]); res=Math.min(res,c); } return res; }
publicintmaxSubarraySumCircular(int[] nums) { int n=nums.length; int pre1=0; //greatest subarray ending in i int res=Integer.MIN_VALUE; int sum=0; int pre2=0; //smallest subarray ending in i int min=0;
for (inti=0; i < n; i++) { sum+=nums[i]; pre1= pre1>=0 ? pre1+nums[i] : nums[i]; pre2= pre2>=0 ? nums[i] : pre2+nums[i]; res=Math.max(res,pre1); min=Math.min(min,pre2); } //however, min cannot be [0,n-1] if(sum!=min){ res=Math.max(res,sum-min); } return res; }