Conversation
| int sum = nums[i]; | ||
| int j = i; | ||
| while (true) { | ||
| if (sum == k) { | ||
| resultCount++; | ||
| } | ||
| j++; | ||
| if (j == nums.length) { | ||
| break; | ||
| } | ||
| sum += nums[j]; | ||
| } |
There was a problem hiding this comment.
このあたりは以下のようにjに関するforループで書くこともできそうです
| int sum = nums[i]; | |
| int j = i; | |
| while (true) { | |
| if (sum == k) { | |
| resultCount++; | |
| } | |
| j++; | |
| if (j == nums.length) { | |
| break; | |
| } | |
| sum += nums[j]; | |
| } | |
| int sum = 0; | |
| for (int j = i; j < nums.length; j++) { | |
| sum += nums[j]; | |
| if (sum == k) { | |
| resultCount++; | |
| } | |
| } |
There was a problem hiding this comment.
確かにそちらの方が素直ですね。ありがとうございます!
| public int subarraySum(int[] nums, int k) { | ||
| Map<Integer, Integer> prefixSumToCount = new HashMap<>(); | ||
| prefixSumToCount.put(0, 1); | ||
| Integer prefixSum = 0; |
There was a problem hiding this comment.
Javaの仕様が分からず教えていただければ嬉しいのですが、
上のコードではintを使われていてこちらはIntegerを使われています。
これはIntegerのほうが良い理由があるからそのようにしているということでしょうか?
There was a problem hiding this comment.
Javaの仕様上、intで宣言しておいた方が良いですね。。。
上段でMapを宣言時にIntegerを使っていたので、Mapに書き込むときにboxingが不要になっていいかと思ったのですが誤りです。
※Mapなどは参照型の値しか格納できないのでIntegerで宣言しています
今回指摘いただき確認するまで厳密に理解していなかったのですが、Interger同士の数値演算を行った場合も、unboxing(Integer→int)が行われint同士に変換された上で計算が実行されるようです。
なので今回のコードで言えば計算に使用する変数は全てintで宣言する方が効率が良さそうです。
良いご指摘いただきありがとうございます。
https://docs.oracle.com/javase/specs/jls/se6/html/conversions.html#170983
If any of the operands is of a reference type, unboxing conversion (§5.1.8) is performed.
There was a problem hiding this comment.
丁寧なご回答ありがとうございます。
- Javaではpremitive型(例: int)と参照型(例: Integer)の違いがある
- premitive型と参照型の間の変換をboxing/unboxingと呼ぶ
- 今回はintで定義することでIntegerへのboxingが行われることによるパフォーマンスへの影響を懸念されていた
- しかし実際計算が行われる際はInteger->intのunboxigがまず行われるのでintのままでよかった
ということで理解しました。
こちらこそJavaについて少し理解が深まりました、ありがとうございます。
|
全体的に良いと思います。 |
今回解いた問題:
560. Subarray Sum Equals K
次に解く問題:
703. Kth Largest Element in a Stream