leetcode_1 Two Sum,Longest Common Prefix

本文介绍了两道LeetCode上的编程题目解决方案,包括寻找数组中两个数的和与求字符串数组的最长公共前缀。通过使用哈希表和Trie树等数据结构优化了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开始在Leetcode上刷点题,新手来的,也是第一次接触,分享一下自己的代码,不足之处还有很多。

1.Two Sum

<span style="font-size:14px;">Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.</span>
要求是给定一个数组和一个数找出数组中和等于给定数的下标,这个是比较简单的问题,最懒得方式是使用循环,由于笔者是第一次写,就直接上了个循环,测试通过,时间复杂度是O(n^2),显示通过测试的时间是85ms。这个自然是要改进的,后来使用HashTable,键是数组值,值是下标,由于HashTable底层还是基于hashcode的数组,所以速度回很快,代码同样简单,如下:

import java.util.Hashtable;
public class Solution {
 public int[] twoSum(int[] nums, int target) {
 
      Hashtable ht=new Hashtable();
        for(int i=0;i<nums.length;i++){
            int complent=target-nums[i];
            if(ht.get(complent)!=null){
                return new int[] { (int)ht.get(complent), i };
            }
            ht.put(nums[i],i);
        }
        throw new IllegalArgumentException("No two sum solution");
 }
}
2.Write a function to find the longest common prefix string amongst an array of strings.

找出一个字符串数组的最长公共前缀。

难度也属于简单,但相对会复杂一点,因为要考虑的情况要多些。我的思路是使用trie树,这个查的速度很快,构建会稍微麻烦一点,关于trie树的实现我在以前的博客中做了实现,这次依据具体情况并不需要全部。还有一个比较重要的是要对字符串数组做一些预处理,最重要的是剔除""。具体实现代码如下,leetcode上117个测试用时7ms,速度还行。

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lenovo on 2016/9/13.
 */
public class LongestCommonPrefix {
    private  Trie t=new Trie();
    public String longestCommonPrefix(String[] strs) {
        String re="";
        if(strs==null){
            return "";
        }
        if(strs.length<1){
            return "";
        }
        if(strs.length==1){
            return strs[0];
        }
        String []noNull=trimNull(strs);
        if(noNull.length!=strs.length){
            return "";
        }
        for(String s:strs){
            t.insertWords(s);
        }
        if(t.getRoot().childNum>=2){
            return "";
        }
        re=t.getLongestPrefix();

        return  re.trim();
    }

    /**
     * 去除数组中的""
     * @param s
     * @return
     */
    private String [] trimNull(String []s){
        List<String> list=new ArrayList<>();
        for(String ss:s){
            if(ss!=null&&!ss.trim().equals("")){
                list.add(ss);
            }
        }
        String [] re=(String [])list.toArray(new String[list.size()]);
        return re;
    }
    class  Trie{
        private  TrieNode root;
        public  Trie(){
            this.root=new TrieNode();
        }
        public void insertWords(String words){

            char[] chars=words.trim().toLowerCase().toCharArray();
            TrieNode tr=root;
            for(int i=0;i<chars.length;i++){
                char c=chars[i];
                int pos=c-'a';
                if(tr.children[pos]==null){
                    TrieNode node=new TrieNode();
                    node.setVal(c);
                    tr.children[pos]=node;
                    tr.childNum++;
                }
                tr=tr.children[pos];

            }
            tr.isend=true;
        }

        public String  getLongestPrefix(){
            String prefix="";
            TrieNode t=root;
            while (t!=null&&t.childNum==1&&!t.isend){
                prefix+=t.getVal();
                for(TrieNode tt:t.getChildren()){
                    if(tt!=null){
                        t=tt;
                        break;
                    }
                }
            }
            prefix+=t.getVal();
            return prefix;
        }
        public TrieNode getRoot() {
            return root;
        }

        public void setRoot(TrieNode root) {
            this.root = root;
        }
    }
    class TrieNode{
        private char val;
        private boolean isend;
        private TrieNode[] children;
        private  int childNum;


        public TrieNode(){
            children=new TrieNode[26];
            isend=false;
            childNum=0;
        }

        public char getVal() {
            return val;
        }

        public void setVal(char val) {
            this.val = val;
        }

        public boolean isend() {
            return isend;
        }

        public void setIsend(boolean isend) {
            this.isend = isend;
        }

        public TrieNode[] getChildren() {
            return children;
        }

        public void setChildren(TrieNode[] children) {
            this.children = children;
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值