有效的括号
easy money
class Solution {
public boolean isValid(String s) {
StringBuilder a = new StringBuilder();
for(int i=0; i<s.length(); i++) {
if(s.charAt(i)=='[' || s.charAt(i)=='{' || s.charAt(i)=='(') {
a.append(s.charAt(i));
}
else if(s.charAt(i)==']') {
if(a.length()==0)return false;
if(a.charAt(a.length()-1)=='[')a.deleteCharAt(a.length()-1);
else break;
}
else if(s.charAt(i)=='}') {
if(a.length()==0)return false;
if(a.charAt(a.length()-1)=='{')a.deleteCharAt(a.length()-1);
else break;
}
else if(s.charAt(i)==')') {
if(a.length()==0)return false;
if(a.charAt(a.length()-1)=='(')a.deleteCharAt(a.length()-1);
else break;
}
}
if(a.length()==0)return true;
else return false;
}
}
查找特定元素范围
原理思想:二分查找
需要注意while里面i<j或者i<=j和ij的初始值有关
class Solution {
public int[] searchRange(int[] nums, int target) {//升序数组
int i=0, j=nums.length-1;
int mid;
int[] res = {-1,-1};
if(nums.length==0 || target<nums[i] || target>nums[j])return res;
while(i<=j) {
mid=i+(j-i)/2;
if(nums[mid]<target) {
i=mid+1;
}
else if(nums[mid]>target) {
j=mid-1;
}
else if(nums[mid]==target) {
j=mid-1; //确定左边界
}
}
int left=i;
i=0;
j=nums.length-1;
while(i<=j) {
mid=i+(j-i)/2;
if(nums[mid]<target) {
i=mid+1;
}
else if(nums[mid]>target) {
j=mid-1;
}
else if(nums[mid]==target) {
i=mid+1; //确定右边界
}
}
int right=j;
if (right < 0 || nums[right] != target)
return res;
res[0]=left;res[1]=right;
return res;
}
}