[java][LeetCode]最長回文サブストリング、最大面積、回転ソート配列でターゲット値を探す

4342 ワード

102ツリー階層反復
キューの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