[java][LeetCode]最長回文サブストリング、最大面積、回転ソート配列でターゲット値を探す
4342 ワード
102ツリー階層反復
キューのdfsクラシック問題
34.ソート配列の最初の位置と最後の位置を検索します.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
二重ポインタ(実行可能):二重ポインタleftとrightはそれぞれ配列の開始、すなわちleft=0、right=nums.length-1を指し、その後、左から右に遍歴し、最初のnums[i]=target、left=iを見つけ、このときleftは左境界である.次に右から左に遍歴し、最初のnums[i]=target、right=iを見つけます.このときrightは右境界です.
33.回転ソート配列で目標値を探す
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
にぶんほう
最長回文子列
Example 1:
Input: "babad"
Output: "bab"
Note: "aba"is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
11、容器の最大面積
/*両端から中間に向かって2つの針を寄せ、左端の線分が右端より短い場合は右端を右に、逆に右端を左に動かし、左右両端が中間に重なることを知り、この過程で各構成バケツの容積を記録し、その中で最大に戻る.左端の線分Lが右端の線分Rより小さい場合、Lを右に移動します.この場合、Lと右端の他の線分(R-1,R-2,...)からなるバケツを捨てます.これらのバケツは判断する必要はありません.これらのバケツの容積はLとRからなるバケツの容積が大きいに違いありません.*/
キューのdfsクラシック問題
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
res, cur_level = [], [root]
while cur_level:
next_level, tmp_res = [], []
for node in cur_level:
tmp_res.append(node.val)
if node.left:
next_level.append(node.left)
if node.right:
next_level.append(node.right)
res.append(tmp_res)
cur_level = next_level
return res
34.ソート配列の最初の位置と最後の位置を検索します.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
二重ポインタ(実行可能):二重ポインタleftとrightはそれぞれ配列の開始、すなわちleft=0、right=nums.length-1を指し、その後、左から右に遍歴し、最初のnums[i]=target、left=iを見つけ、このときleftは左境界である.次に右から左に遍歴し、最初のnums[i]=target、right=iを見つけます.このときrightは右境界です.
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
arr=[-1,-1]
if not nums:
return arr
left=0
right=len(nums)-1
while left<=right:
if nums[left]==target:
arr[0]=left
break
else:
left+=1
while left<=right:
if nums[right]==target:
arr[1]=right
break
else:
right-=1
return arr
33.回転ソート配列で目標値を探す
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
にぶんほう
#coding:utf8
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return -1
l=len(nums)
left=0
right=l-1
while left<=right:
m=(left+right)/2
if nums[m]==target:
return m
if nums[m]nums[m] and target<=nums[right]:
left=m+1
else:
right=m-1
else: # left m
if target=nums[left]:
right=m-1
else:
left=m+1
return -1
最長回文子列
Example 1:
Input: "babad"
Output: "bab"
Note: "aba"is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
class Solution {
public String longestPalindrome(String s) {
if(s.length()==1)return s;
int max=0;
String res=new String();
for (int i=0;imax){
max=temp.length();
res=temp;
}
if(i !=s.length()-1){
L=i;R=i+1;//abba
temp=getPlength(s,L,R);
if (temp.length()>max){
max=temp.length();
res=temp;
}
}
}
return res;
}
private String getPlength(String s,int L,int R){
while (L>=0 && R
11、容器の最大面積
/*両端から中間に向かって2つの針を寄せ、左端の線分が右端より短い場合は右端を右に、逆に右端を左に動かし、左右両端が中間に重なることを知り、この過程で各構成バケツの容積を記録し、その中で最大に戻る.左端の線分Lが右端の線分Rより小さい場合、Lを右に移動します.この場合、Lと右端の他の線分(R-1,R-2,...)からなるバケツを捨てます.これらのバケツは判断する必要はありません.これらのバケツの容積はLとRからなるバケツの容積が大きいに違いありません.*/
import java.util.*;
class Solution {
public int maxArea(int[] height) {
int max=0;
int len=height.length;
int left=0;
int right=len-1;
while (left