暑假算法7.12,Day11
第一题
class Solution {
public int specialArray(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
int l = 1, r = nums[n - 1];
while (l <= r) {
int mid = (l + r )/2;
if (judge(mid, nums) == mid) {
return mid;
}
else if (judge(mid, nums) < mid){
r = mid - 1;
}
else {
l = mid + 1;
}
}
return -1;
}
public static int judge(int a, int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r ) /2;
if (nums[mid] < a) {
l = mid + 1;
}
else {
r = mid;
}
}
return n - l;
}
}
第二题
class Solution {
public int shipWithinDays(int[] weights, int days) {
int summ=0;
int left=0;
for(int a:weights){
summ+=a;
left=Math.max(left,a);
}
int right = summ+1;
while (left < right) {
int mid = (left + right) / 2;
int need = 1, cur = 0;
for (int weight : weights) {
if (cur + weight > mid) {
++need;
cur = 0;
}
cur += weight;
}
if (need <= days) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
第三题
class Solution {
public int[] successfulPairs(int[] spells, int[] potions, long success) {
int[] ans=new int[spells.length];
Arrays.sort(potions);
long[] arr=new long[potions.length];
for (int i = 0; i < arr.length; i++) {
arr[i]=potions[i];
}
for (int i = 0; i < spells.length; i++) {
int index;
if(arr[arr.length-1]*spells[i]<success){
index=arr.length;
}
int l=0;
int r=arr.length;
while(l<r){
int mid=(l+r)/2;
if(arr[mid]*spells[i]>=success){
r=mid;
}else{
l=mid+1;
}
}
index=r;
ans[i]=potions.length-index;
}
return ans;
}
}
第四题
Polycarp Writes a String from Memory
这个题目犯了一个错就是直接把所有的元素放进set中,然后再判断能否被3整除,得到的结果和样例的结果是不一样的。
看了别人的代码才明白,由于Polycarp一次性只能记三个,所以在之前记过的字母,后续如果还需要用到,那么就不能直接用,也占用一个记忆字母的名额,所以只能一次次的判断,不能一次性判断。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
set<char>p;
cin>>n;
while(n--)
{
string str;
cin>>str;
set<char> ab;
int summ=0;
int m=str.size();
for(int i=0; i<m; i++){
ab.insert(str[i]);
if(ab.size()>3){
summ++;
ab.clear();
ab.insert(str[i]);
}
}
if(ab.size()>0){
summ++;
}
cout<<summ<<endl;
}
return 0;
}