写在前面:
本次周赛做出第一题和第二题。
难度:Easy
代码:
class Solution {
public boolean isPrefixString(String s, String[] words) {
char[] arr=s.toCharArray();
StringBuilder sb=new StringBuilder();
for(String word:words){
sb.append(word);
if(sb.length()>=arr.length){
break;
}
}
if(sb.length()!=arr.length){
return false;
}
int i=0,j=0;
for( ;i<arr.length;i++,j++){
if(arr[i]!=sb.charAt(j)){
return false;
}
}
return true;
}
}
难度:Medium
题目大意:
详见题意。
思路:
贪心 ,每次选择数组中最大的元素来进行操作。
代码
class Solution {
public int minStoneSum(int[] piles, int k) {
PriorityQueue<Integer> pq=new PriorityQueue<>((a,b)->b-a);
for(int n:piles){
pq.offer(n);
}
while(k-->0){
int n=pq.poll();
n-=n/2;
pq.offer(n);
}
int res=0;
while(!pq.isEmpty()){
res+=pq.poll();
}
return res;
}
}
难度:Medium
题目大意:
括号匹配。
思路:
找规律,推导数学公式。参考高赞回答。
代码
class Solution {
public int minSwaps(String s) {
char[] arr=s.toCharArray();
int misMatch=0;
for(char c:arr){
if(c=='['){
misMatch++;
}
else{
if(misMatch>0){
misMatch--;
}
}
}
return (misMatch+1)/2;
}
}
难度:Hard
题目大意:
详见题目。
思路
动态规划会超时,需要用二分+贪心,这一题与Leetcode 300. Longest Increasing Subsequence类似,可以参考Leetcode 300 官方题解。本题还参考了高赞回答。
代码
class Solution {
public int[] longestObstacleCourseAtEachPosition(int[] nums) {
int n=nums.length;
int[] d=new int[n+1];
int len=1;
d[1]=nums[0];
int[] res=new int[n];
res[0]=len;
for(int i=1;i<n;i++){
if(nums[i]>=d[len]){
len++;
d[len]=nums[i];
res[i]=len;
}
else{
int l=0,r=len;
while(l<r){
int mid=l+(r-l+1)/2;
if(d[mid]>nums[i]){
r=mid-1;
}
else{
l=mid;
}
}
d[l+1]=nums[i];
res[i]=l+1;
}
}
return res;
}
}
|