アルゴリズム
leetcode 1:二つの合計
public int[] twoSum(int[] nums, int target) {
if (nums == null || nums.length < 2) return new int[] {-1, -1};
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
int key = target - nums[i];
if (map.containsKey(key)) return new int[] {map.get(key), i};
else map.put(nums[i], i);
}
return new int[] {-1, -1};
}
leetcode 15:3Sum
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<>();
for(int i = 0; i < nums.length - 2; i++) {
if(i == 0 || nums[i] != nums[i-1]) {
int lo = i + 1;
int hi = nums.length - 1;
int value = 0 - nums[i];
while(lo < hi) {
if(nums[lo] + nums[hi] == value) {
list.add(Arrays.asList(nums[i], nums[lo], nums[hi]));
while(lo < hi && nums[lo] == nums[lo+1]) lo++;
while(lo < hi && nums[hi] == nums[hi-1]) hi--;
lo++;
hi--;
} else if(nums[lo] + nums[hi] < value) {
// while(lo < hi && nums[lo] == nums[lo+1]) lo++;
lo++;
} else {
// while(lo < hi && nums[hi] == nums[hi-1]) hi--;
hi--;
}
}
}
}
return list;
}
2つのループをコメントアウトすると、追加する必要はありません、プログラムのパフォーマンスを改善しないだけでなく、プログラムはいくつかのステートメントを実行するよりも、裁判官多くを与えるだろう。
leetcode 16:3Sum最も近いです
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int result = nums[0] + nums[1] + nums[nums.length - 1];
for(int i = 0; i < nums.length - 2; i++) {
int lo = i + 1;
int hi = nums.length - 1;
while(lo < hi) {
int value = nums[i] + nums[lo] + nums[hi];
if(value == target) return target;
else if(value < target) lo++;
else hi--;
if(Math.abs(value - target) < Math.abs(result - target)) result = value;
}
}
return result;
}
leetcode 18:4Sum
この質問と3Sumは非常に似て、あなたはこの質問に答えるために同じアイデアを使用することができるようにします。デエンファシスを容易にするために、オーダーしてみましょう。
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<>();
for(int i = 0; i < nums.length - 3; i++) {
if(i > 0 && nums[i] == nums[i-1]) continue;
for(int j = i+1; j < nums.length - 2; j++) {
// if(nums[j] == nums[j-1]) continue;
if((j - 1) != i && nums[j] == nums[j-1]) continue;
int lo = j + 1;
int hi = nums.length - 1;
while(lo < hi) {
int value = nums[i] + nums[j] + nums[lo] + nums[hi];
if(value == target) {
list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]));
while(lo < hi && nums[lo] == nums[lo+1]) lo++;
while(lo < hi && nums[hi] == nums[hi-1]) hi--;
lo++;
hi--;
} else if(value < target) {
lo++;
} else {
hi--;
}
}
}
}
return list;
}
コメント部分を使用することはできませんif(nums[j] == nums[j-1]) continue;
のためにj
ろ過。第一要素と第2の要素は、同じとすることができるからです。
我々はブラッシング終わったら3Sumと4Sumを、我々はかすかな気持ちを持つことになり、任意の整数k(K> = 2)のために、我々はkSumに答えることができます。実際、kSumのために、我々は二つのサブ問題に問題を打破することができます。
- 2Sumを解きます
- (K-1)まで減少kSum合計
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
return kSum(nums, target, 4);
}
public List<List<Integer>> kSum(int[] nums, int target, int k) {
Arrays.sort(nums);
return kSum(nums, target, k, 0);
}
private List<List<Integer>> kSum(int[] nums, int target, int k, int fromIndex) {
List<List<Integer>> list = new ArrayList<>();
if(fromIndex + k > nums.length) return list;
if(k == 2) {
int lo = fromIndex;
int hi = nums.length - 1;
while(lo < hi) {
int value = nums[lo] + nums[hi];
if(value == target) {
List<Integer> t = new LinkedList<>();
t.add(nums[lo]);
t.add(nums[hi]);
list.add(t);
while(lo < hi && nums[lo] == nums[lo+1]) lo++;
while(lo < hi && nums[hi] == nums[hi-1]) hi--;
lo++;
hi--;
} else if(value < target) {
lo++;
} else {
hi--;
}
}
return list;
}
for(int i = fromIndex; i <= nums.length - k; i++) {
List<List<Integer>> temp = kSum(nums, target-nums[i], k-1, i+1);
if(!temp.isEmpty()) {
for(List<Integer> t : temp) {
t.add(0, nums[i]);
}
list.addAll(temp);
}
while(i <= nums.length - k && nums[i] == nums[i+1]) i++;
}
return list;
}
}
レビュー
今週ように読んメディアの記事がタイトルは、記事への「グレート開発は止まらない学習」。記事では、著者は、ITプロフェッショナルは、継続的な学習を維持するための7つの方法について説明します。
- 読書の芸術
- Avidのライターへの熱心な読者から
- 聞いて
- オンラインコースを取ります
- 習うより慣れろ
- 同僚のネットワークを活用
- 社交
先端
MySQLは使用頻度の高いshow processlist
問題をトラブルシューティングするためのコマンドを。
show processlist
情報スレッドことを確認してください。rootユーザーのみがすべてのスレッドを見ることができ、ユーザはPROCESS権限を与えられていない限り、他のユーザーは、自分のスタートスレッドを見ることができます。
show processlist
MySQLデータベースのクエリは、PROCESSLISTテーブル内のINFORMATION_SCHEMAシステムです。show processlist
それはと同等です。
select * from information_schema.processlist;
各フィールドの簡単な意味は、次のとおりです。
上記ID:識別スレッド、またinformation_schema.processlistテーブルの主キー。
ユーザー:ユーザーは、このスレッドを開始します。
ホスト:クライアントのIPアドレスとポートを記録します。
DB:現在データベースれているコマンドを実行しています。そうでない場合use database
、それはNULLです。
コマンド:スレッドを実行コマンド、および対応する状態。
時間:現在の状態を持っているどのくらい。
状態:スレッドの状態は、より複雑です。
情報:一般的な記録は、現在のコマンドを実行しています。デフォルトの表示のみ100文字。
シェア
エントロピーと熱力学第二法則が密接に簡単な言葉に関連して、エントロピーは、障害の程度エントロピー大きい、高い、物事の障害の程度を記述することです。我々は熱力学第二法則は不可逆的なプロセスを説明知っている、これはエントロピー増加のプロセスです。
だから、分離されたシステムでは、物事は常にエントロピー増加の原則であるより無秩序な開発、の方向に動いています。したがって、宇宙は最終的には徹底した障害、我々はそれを呼び出すことができますに乗り出す「永遠の死。」
おそらく、組織的に自分自身を維持しようとする過程で完全な障害に向けて一歩一宇宙工程での人間の存在の意味があります。